개요
PHP 클래스에서 static 키워드로 선언된 속성과 메서드는 일반 인스턴스처럼 객체를 생성한 뒤 -> 연산자로 접근할 수 없습니다. 정적 멤버는 객체 없이도 클래스 자체를 통해 직접 접근할 수 있다는 것이 핵심 특징입니다. 또한 클래스 내에서 정적 항목의 기본 가시성(visibility)은 public입니다.
정적 속성(Static Properties)
클래스 외부에서 정적 속성에 접근하려면 범위 해결 연산자(scope resolution operator)인 ::를 클래스 이름과 함께 사용해야 합니다. 흥미롭게도 클래스 이름으로 평가되는 문자열 변수를 통해서도 정적 속성에 접근할 수 있습니다.
<?php
class testclass{
static $name="test";
}
echo testclass::$name;
$var="testclass";
echo $var::$name;
?>같은 클래스 내부의 메서드 안에서 정적 속성을 사용하려면, 인스턴스 속성에 접근할 때 쓰는 -> 연산자 대신 self 키워드를 사용합니다.
<?php
class testclass{
static $name="test";
public function test(){
echo self::$name;
}
}
$obj=new testclass();
$obj->test();
?>부모 클래스에 선언된 정적 속성을 자식 클래스의 메서드 안에서 참조해야 할 때는 parent 키워드를 범위 해결 연산자와 함께 사용하면 됩니다.
<?php
class testclass{
static $name="test";
public function test(){
echo self::$name;
}
}
class myclass extends testclass{
public function mytest(){
echo parent::$name;
}
}
$obj=new myclass();
$obj->mytest();
?>정적 메서드(Static Methods)
메서드가 static으로 선언되면 의사 변수(pseudo-variable)인 $this를 사용할 수 없습니다. 따라서 정적 메서드 내부에서는 해당 클래스의 인스턴스 속성에 접근하는 것이 불가능합니다. 정적 메서드는 객체 생성 없이 클래스 이름과 범위 해결 연산자(::)를 이용해 호출합니다.
다음 예제에서 클래스는 정적 속성 $count를 가지고 있으며, 생성자(constructor)가 실행될 때마다(즉, 객체가 생성될 때마다) 값이 1씩 증가합니다. 그리고 클래스 내부에는 이 정적 속성의 값을 조회하는 정적 함수가 정의되어 있습니다.
예제 코드
<?php
class testclass{
static $count=0;
function __construct(){
self::$count++;
}
static function showcount(){
echo "count = " . self::$count;
}
}
$a=new testclass();
$b=new testclass();
$c=new testclass();
testclass::showcount();
?>실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
count = 3
이처럼 정적 속성은 모든 객체가 공유하는 상태를 저장하는 데 유용하며, 위 예제에서는 세 개의 객체가 생성되었기 때문에 카운트가 3이 된 것을 확인할 수 있습니다.