2012-10-22 3 views
0

이 늦은 정적 바인딩이 어떻게 작동하는지 알 수 없습니다.정상입니까?

abstract class A{ 

    final public static function doprint(){ 
    print get_called_class() . '<br>'; 
    } 


    public static function wrapper(){ 
    self::doprint(); 
    static::doprint(); 
    } 

} 

class A2 extends A{}  

A2::wrapper(); 

get_called_class()는 두 방법 모두에서 A2를 인쇄합니다. 왜?

답변

1

get_called_class()은 항상 실제로 호출하는 클래스를 반환합니다. A2 ::이므로 A2입니다.

내 사이트에는 LSB 싱글 톤 추상 클래스과 함께 자습서가 있습니다. 나는 항상 좀비 자경단이 와서 보지 않고 링크를 제거하기 때문에 여기에 링크하지 않습니다. 하지만 내 설명에 있습니다.

LSB의 catch는 A의 메소드가 A의 메소드를 호출 할 수있는 B의 메소드를 호출 할 수 있다는 것입니다. 이 예를 참조하십시오

header('Content-Type: text/plain'); // Pretty text output 
// LSB Parent 
class A { 
    // NOLSB: Will call Current Class method 
    static public function TriggerSelf() { 
     self::OverrideMe(); 
    } 
    // LSB: Will call Inheriting Class method (or Current if none Inherits) 
    static public function TriggerStatic() { 
     static::OverrideMe(); 
    } 
    // Method to Override 
    static public function OverrideMe() { 
     echo 'A here', PHP_EOL; 
    } 
} 

// LSB Child 
class B extends A { 
    // Override by LSB 
    static public function OverrideMe() { 
     echo 'B here', PHP_EOL; 
    } 
} 

A::TriggerSelf(); // <- NO LSB 
A::TriggerStatic(); // <- LSB (but not inheritance) 

B::TriggerSelf(); // <- NO LSB 
B::TriggerStatic(); // <- LSB (with inheritance, so it works) 

B : TriggerStatic는()는 A가 B : TriggerSelf (동안 B의 메소드를 호출 할 수 있습니다 방법 참조) 방법 호출. LSB입니다. 부모 클래스 정적 메서드는 자식 클래스 정적 메서드를 호출 할 수 있습니다. 꽤 정적 인 초록입니다 :)

예제를 살펴보면 이해가됩니다.

1

get_called_class()은 어떤 클래스가 호출되었고 출력이 정확한지 알려주고 있습니다.

후기 정적 바인딩을 사용하면 self 컨텍스트가 거품을 일으키기 때문에 더 높은 정의 된 메서드는 호출 된 메서드의 개체에서 작동 할 수 있습니다.

관련 문제