Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP 후기 정적 바인딩

<시간/>

소개

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 ''