>  기사  >  백엔드 개발  >  PHP 후기 바인딩

PHP 후기 바인딩

不言
不言원래의
2018-04-04 14:19:011288검색

이 글의 내용은 PHP 후기 바인딩입니다. 이제 모든 분들과 공유하겠습니다. 도움이 필요한 친구들도 이 글을 참고하시면 됩니다


php 후기 정적 바인딩

PHP에는 기능이 추가되었습니다. 상속 범위에서 정적으로 호출된 클래스를 참조하는 데 사용되는 후기 정적 바인딩이라고 합니다.

정확히 말하면 후기 정적 바인딩의 작동 원리는 이전 "비 전달 호출"(비 전달

)에 데이터를 저장하는 것입니다. 전화) 클래스 이름. 정적 메서드 호출을 수행할 때 클래스 이름은 명시적으로 지정됩니다(보통 ::

에 있음). 연산자); 비정적 메서드 호출을 수행할 때는 개체가 속한 클래스입니다. 소위 "통화 전달"(전달
호출)은 self::, parent::, static:: 및
메서드를 통한 정적 호출을 나타냅니다. 전달_정적_호출(). get_called_class() 함수를 사용하여 호출된 메서드의 클래스 이름 static::을 가져올 수 있습니다.
그 범위를 지적합니다.

이 기능은 언어 내부 관점에서 "후기 정적 바인딩"이라고 합니다. "늦은 바인딩"은 static::

을 의미합니다. 더 이상 현재 메서드가 정의된 클래스로 구문 분석되지 않지만 실제 런타임 중에 계산됩니다. 정적 메서드 호출에 사용할 수 있으므로(그러나 이에 국한되지는 않음) "정적 바인딩"이라고도 합니다.


self


현재 메서드가 정의된 클래스에 따라 현재 클래스에 대한 정적 참조인 self:: 또는

CLASS

를 사용하세요. 예제 #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 후기 정적 바인딩

후기 정적 바인딩의 사용은 런타임에 처음 호출된 클래스를 나타내는 새 키워드를 도입하여 제한을 우회하기 위한 것입니다. 간단히 말해서, 이 키워드를 사용하면 위 예제에서 test()를 호출할 때 A 클래스 대신 B 클래스를 참조할 수 있습니다. 결국 새로운 키워드를 도입하지 않고 이미 예약된 정적 키워드를 사용하기로 결정되었습니다.

<?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 후기 바인딩의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.