이 글의 내용은 PHP 후기 바인딩입니다. 이제 모든 분들과 공유하겠습니다. 도움이 필요한 친구들도 이 글을 참고하시면 됩니다
PHP에는 기능이 추가되었습니다. 상속 범위에서 정적으로 호출된 클래스를 참조하는 데 사용되는 후기 정적 바인딩이라고 합니다.
정확히 말하면 후기 정적 바인딩의 작동 원리는 이전 "비 전달 호출"(비 전달
)에 데이터를 저장하는 것입니다. 전화) 클래스 이름. 정적 메서드 호출을 수행할 때 클래스 이름은 명시적으로 지정됩니다(보통 ::에 있음). 연산자); 비정적 메서드 호출을 수행할 때는 개체가 속한 클래스입니다. 소위 "통화 전달"(전달
을 의미합니다. 더 이상 현재 메서드가 정의된 클래스로 구문 분석되지 않지만 실제 런타임 중에 계산됩니다. 정적 메서드 호출에 사용할 수 있으므로(그러나 이에 국한되지는 않음) "정적 바인딩"이라고도 합니다.
호출)은 self::, parent::, static:: 및
메서드를 통한 정적 호출을 나타냅니다. 전달_정적_호출(). get_called_class() 함수를 사용하여 호출된 메서드의 클래스 이름 static::을 가져올 수 있습니다.
그 범위를 지적합니다.
이 기능은 언어 내부 관점에서 "후기 정적 바인딩"이라고 합니다. "늦은 바인딩"은 static::self
현재 메서드가 정의된 클래스에 따라 현재 클래스에 대한 정적 참조인 self:: 또는
를 사용하세요. 예제 #1 self:: 사용법
<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } }class B extends A { public static function who() { echo __CLASS__; } } B::test(); //输出A?>
static 후기 정적 바인딩
<?phpclass A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } }class B extends A { public static function who() { echo __CLASS__; } } B::test(); //输出B?>참고:
비정적 환경에서 호출되는 클래스는 객체 인스턴스가 속한 클래스입니다. $this->는 동일한 범위에서 개인 메소드를 호출하려고 시도하지만 static::
다른 결과를 줄 수도 있습니다. 또 다른 차이점은 static::은 정적 속성에만 사용할 수 있다는 것입니다.비정적 환경에서 static::
<?phpclass A { private function foo() { echo "success!\n"; } public function test() { $this->foo(); static::foo(); } }class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */}class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } }$b = new B();$b->test();$c = new C();$c->test(); //fails?>을 사용하면 다음이 출력됩니다.
착신 전환 및 비전달 호출성공! 치명적인 오류: 9행의 /tmp/test.php에 있는 컨텍스트 'A'에서 개인 메소드 C::foo()를 호출합니다.
참고:
완전히 해결된 정적 호출을 얻을 때까지 늦은 정적 바인딩 해결이 계속됩니다. 반면에 parent:: 또는 self::를 사용하여 정적으로 호출되면 호출 정보가 전달됩니다.
<?phpclass A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } }class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } }class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test();?>
A C C관련 권장 사항:
PHP의 후기 바인딩
위 내용은 PHP 후기 바인딩의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!