소개
PHP에서 후기 정적 바인딩의 이 기능은 정적 상속에서 클래스를 참조하는 데 사용됩니다. 정적 메서드가 호출되면 클래스 이름에 범위 결정 연산자(::)가 붙고 다른 인스턴스 메서드의 경우 객체 이름을 사용하여 호출합니다. static::은 메서드가 정의된 클래스를 사용하여 해결되지 않고 대신 런타임 정보를 사용하여 계산됩니다. 현재 클래스에 대한 정적 참조는 정의된 위치가 아니라 함수가 속한 클래스를 사용하여 확인됩니다.
예시
다음 코드에서 부모 클래스는 self::접두사로 정적 ethod를 호출합니다. 자식 클래스로 호출할 때 동일한 메서드가 확인되지 않아 자식 클래스 이름을 참조하지 않습니다.
예시
<?php class test1{ public static $name="Raja"; public static function name(){ echo "name of class :" . __CLASS__; } public static function getname(){ self::name(); } } class test2 extends test1{ public static function name(){ echo "name of class :" . __CLASS__; } } test2::getname(); ?>
출력
결과는 예상대로 상위 클래스의 이름이 반환되었음을 보여줍니다.
name of class :test1
self::대신 static::을 사용하면 런타임에 런타임에 바인딩이 생성됩니다.
예시
<?php class test1{ public static function name(){ echo "name of class :" . __CLASS__; } public static function getname(){ static::name(); } } class test2 extends test1{ public static function name(){ echo "name of class :" . __CLASS__; } } test2::getname(); ?>
위의 코드는 이제 예상대로 자식 클래스의 이름을 반환합니다.
출력
name of class :test2
비정적 컨텍스트에서 static::사용
부모의 private 메소드는 자식에게 복사되므로 범위는 여전히 부모입니다.
예시
<?php class test1{ private function name(){ echo "name of class :" . __CLASS__ ."\n"; } public function getname(){ $this->name(); static::name(); } } class test2 extends test1{ // } $t2=new test2(); $t2->getname(); ?>
출력
출력은 다음 결과를 보여줍니다.
name of class :test1 name of class :test1
그러나 부모 메서드가 재정의되면 범위가 변경됩니다.
예시
class test3 extends test1{ private function name() { /* original method is replaced; the scope of name is test3 */ } } $t3 = new test3(); $t3->name();
출력
출력은 다음 예외를 보여줍니다.
PHP Fatal error: Uncaught Error: Call to private method test3::name() from context ''