PHP Static Properties
PHP 정적 속성(Static Properties): 클래스 전역에서 공유되는 값
- *PHP 정적 속성(Static Properties)**은 객체 지향 프로그래밍에서 클래스 인스턴스와 무관하게 클래스 자체에 속하는 공유 변수입니다. 즉, 클래스의 모든 인스턴스에서 공유되는 변수로, 객체 간의 상태를 공유하거나 클래스 전반에 걸쳐 공통된 값을 저장하는 데 유용합니다. 정적 속성은 클래스의 고유 상태를 유지할 수 있으며, 주로 상태 관리나 카운팅과 같은 기능에 사용됩니다.
이 가이드에서는 PHP 정적 속성의 개념, 정의 방법, 정적 속성의 실용적인 예제, 일반 속성과의 차이점 및 주의사항을 다룹니다.
1. PHP 정적 속성의 개념
- *정적 속성(Static Properties)**은 클래스 인스턴스에 속하지 않고 클래스 자체에 속하는 변수입니다. 객체 지향 프로그래밍에서 정적 속성은 객체를 생성하지 않고도 클래스 이름을 통해 직접 접근할 수 있으며, 클래스의 모든 인스턴스 간에 공유됩니다.
1.1 정적 속성의 특징
- 객체 생성 없이 클래스 이름으로 직접 접근할 수 있습니다.
- 클래스 전체에서 공유되며, 인스턴스마다 개별적인 값을 가지지 않습니다.
- 클래스 내에서
self::
키워드를 사용해 정적 속성에 접근할 수 있습니다. - 클래스 외부에서는
클래스명::$속성명
형식으로 접근합니다.
2. PHP 정적 속성 정의
정적 속성은 static
키워드를 사용하여 클래스 내에서 정의됩니다. 정의된 정적 속성은 클래스 이름으로 직접 접근할 수
있으며, 객체를 생성할 필요가 없습니다.
2.1 정적 속성 정의 및 사용 예제
<?php
class Counter {
public static $count = 0; // 정적 속성
public static function increment() {
self::$count++; // 클래스 내에서 정적 속성에 접근
}
public static function getCount() {
return self::$count; // 정적 속성 값 반환
}
}
// 클래스 이름으로 정적 메서드 호출 및 정적 속성 값 변경
Counter::increment();
Counter::increment();
echo Counter::getCount(); // 결과: 2
?>
설명:
public static $count
: 클래스 내에서 정적 속성을 정의합니다. 이는 클래스 인스턴스와 무관하게 클래스 자체의 상태를 나타냅니다.self::$count
: 클래스 내에서 정적 속성에 접근할 때는self::
키워드를 사용합니다.Counter::getCount()
: 클래스 외부에서 정적 속성에 접근할 때는 클래스 이름으로 직접 접근합니다.
3. 정적 속성과 일반 속성의 차이점
정적 속성과 일반 속성은 모두 클래스 내에서 정의되지만, 속성의 소속과 동작 방식에서 차이가 있습니다.
3.1 정적 속성과 일반 속성의 비교
특성 | 정적 속성 (Static Property) | 일반 속성 (Instance Property) |
---|---|---|
속성의 소속 | 클래스 자체에 속하며, 인스턴스와 무관 | 클래스 인스턴스(객체)에 속함 |
값의 공유 여부 | 클래스의 모든 인스턴스에서 공유됨 | 인스턴스마다 개별적인 값을 가짐 |
접근 방식 | 클래스 이름으로 직접 접근 (Class::$property ) |
객체를 통해 접근 ($object->property ) |
초기화 시점 | 클래스가 로드될 때 한 번 초기화됨 | 객체가 생성될 때마다 초기화됨 |
3.2 정적 속성과 일반 속성 비교 예제
<?php
class Example {
public static $staticValue = "Static"; // 정적 속성
public $instanceValue = "Instance"; // 일반 속성
public function showValues() {
echo "Static: " . self::$staticValue . "<br>"; // 정적 속성 접근
echo "Instance: " . $this->instanceValue . "<br>"; // 일반 속성 접근
}
}
$example1 = new Example();
$example1->showValues(); // 결과: Static: Static, Instance: Instance
$example2 = new Example();
$example2->instanceValue = "Changed Instance"; // 일반 속성 변경
$example1->showValues(); // 결과: Static: Static, Instance: Instance
$example2->showValues(); // 결과: Static: Static, Instance: Changed Instance
?>
설명:
- 정적 속성은 클래스 전체에서 공유되므로, 모든 객체가 동일한 값을 참조합니다.
- 일반 속성은 각각의 객체가 개별적으로 값을 가지며, 인스턴스마다 다른 값을 가질 수 있습니다.
4. 정적 속성의 실용적인 예제
4.1 카운터 관리
정적 속성은 카운터와 같이 공유되는 상태를 관리하는 데 유용합니다. 예를 들어, 클래스가 몇 번 호출되었는지 추적하는 기능을 쉽게 구현할 수 있습니다.
<?php
class VisitorCounter {
public static $visitorCount = 0; // 방문자 카운터
public static function incrementVisitor() {
self::$visitorCount++;
}
public static function getVisitorCount() {
return self::$visitorCount;
}
}
// 방문자 카운터 증가
VisitorCounter::incrementVisitor();
VisitorCounter::incrementVisitor();
echo "Total visitors: " . VisitorCounter::getVisitorCount(); // 결과: Total visitors: 2
?>
설명:
- 정적 속성인
$visitorCount
는 방문자 수를 추적하며, 모든 호출에서 공유된 값을 사용합니다. - 정적 메서드를 통해 방문자 수를 관리하고, 그 값을 반환합니다.
4.2 데이터베이스 연결 관리
정적 속성은 데이터베이스 연결처럼 전역 상태를 관리하는 데도 유용합니다. 동일한 데이터베이스 연결을 여러 객체에서 공유할 수 있습니다.
<?php
class Database {
private static $connection = null;
public static function connect() {
if (self::$connection === null) {
self::$connection = new mysqli("localhost", "user", "password", "database");
}
return self::$connection;
}
}
// 데이터베이스 연결 공유
$db1 = Database::connect();
$db2 = Database::connect();
if ($db1 === $db2) {
echo "Same database connection instance.<br>"; // 결과: Same database connection instance.
}
?>
설명:
Database
클래스의 정적 속성 **$connection
*은 단일 데이터베이스 연결을 유지하며, 모든 객체에서 공유됩니다.- 첫 번째 연결 이후에는 이미 연결된 인스턴스를 반환하여 자원을 절약합니다.
5. 정적 속성 사용 시 주의사항
5.1 상태 공유에 대한 주의
정적 속성은 클래스 전역에서 공유되는 값을 나타내기 때문에, 여러 인스턴스에서 동일한 값에 접근하고 변경할 수 있습니다. 이로 인해 의도하지 않은 값 변경이나 상태 변화가 발생할 수 있습니다.
5.2 상속과 정적 속성
정적 속성은 상속할 수 있으며, 부모 클래스의 정적 속성을 자식 클래스에서 공유하거나 재정의할 수 있습니다.
<?php
class ParentClass {
public static $staticValue = "Parent";
public static function showValue() {
echo self::$staticValue . "<br>";
}
}
class ChildClass extends ParentClass {
public static $staticValue = "Child";
}
ParentClass::showValue(); // 결과: Parent
ChildClass::showValue(); // 결과: Child
?>
설명:
ParentClass
와ChildClass
는 각각의 정적 속성을 가집니다. 정적 속성은 상속되어 각 클래스별로 따로 관리될 수 있습니다.
5.3 접근 권한
정적 속성에도 **가시성 제어자(public, private, protected)**를 사용할 수 있습니다. private
또는
**protected
**로 설정된 정적 속성은 **외부에서 직접
접근할 수 없으며**, 클래스 내에서만 사용됩니다.
6. 정적 메서드와 정적 속성의 차이
- 정적 메서드는 객체 생성 없이 클래스 자체에서 호출할 수 있는 메서드입니다. 주로 클래스의 공통된 동작을 정의할 때 사용됩니다.
- 정적 속성은 객체 생성 없이 클래스에서 공유되는 데이터를 저장하는 변수로, 클래스 상태를 관리할 때 사용됩니다.
요약
PHP의 **정적 속성(Static Properties)**은 클래스 자체에 속하는 변수로, 객체 간에 공유되는 값을 저장하는 데 유용합니다. 객체를 생성하지 않고 클래스 이름으로 직접 접근할 수 있으며, 클래스 전반에 걸쳐 공통된 상태를 관리하는 데 주로 사용됩니다. 카운팅, 전역 설정 및 데이터베이스 연결 관리와 같은 상황에서 정적 속성은 매우 유용하며, 클래스 전역 상태를 쉽게 관리할 수 있게 해줍니다.