PHP 의 Calling Scope

  • 저자: Laruence
  • 본 고의 주소:http://www.laruence.com/2012/06/14/2628.html

  • 문 제 는 여기 있 습 니 다: phop 중 입 니 다.콜 과callstatic 이 계승 되면 발생 하 는 bug?
    이 문 제 는 언뜻 보기 에는 사람 을 현혹 시 키 기 쉽 지만 실제로 이러한 오 해 를 일 으 키 는 근본 적 인 원인 은 PHP 에서 정적 여 부 를 판단 하 는 것 은 ':' (PAAMAYIM NEKUDOTAYIM) 기호 가 아니 라 calling scope 에 의 한 것 이다.
    그럼, calling scope 는 무엇 입 니까?
    PHP 에서 하나의 방법 을 호출 할 때 $this 포인터 가 가리 키 는 대상 은 이 방법 이 호출 된 시간의 calling scope 입 니 다. 다음 예 에 대해 서 는:
        <?php
        Foo::bar();
        ?>

    bar 방법 을 호출 할 때 calling scop e 도 메 인 이 없 는 컨 텍스트 에 있 기 때문에 이것 은 정적 호출 입 니 다.
    다음 과 같은 예 에 대해:
        <?php
        class A {
             public function test() {
                 Foo::bar();
             }
         }
        $a = new A();
        $a->test();

    bar 방법 을 호출 할 때 $a 대상 의 컨 텍스트 에 있 습 니 다. 즉, 이때 calling scope 는 $a 대상 이기 때문에 이것 은 정적 호출 이 아 닙 니 다.
    이 결론 을 검증 하기 위해 다음 의 실제 예 를 보십시오.
        <?php
         class Foo {
             public function bar() {
                 var_dump($this);
             }
         }
         class A {
             public function test() {
                 Foo::bar();
             }
         }
         $a = new A();
         $a->test();
        ?>
    뭘 수출 할 까요?
    object(A)#1 (0) {}

    bar 를 호출 할 때 이 '정적' 호출 처럼 보 이 는 호출 입 니 다. $this 지침 은 할당 되 었 습 니 다. $a 대상 을 가리 키 고 있 습 니 다. 그러면 이것 도 정적 호출 입 니까?
    제 가 이 예 를 들 면 이 문 제 를 설명 하기 위해 서 입 니 다. 그러나 여러분 들 은 실제 응용 에서 사용 을 피해 야 합 니 다. ":" 비정 상 방법 을 호출 하면 PHP 도 이러한 호출 에 대해 Strict 경 고 를 합 니 다.
    Strict Standards: Non-static method Foo::bar() should not be called statically, assuming $this from incompatible context

    누가 이 걸 bug 라 고 하 겠 죠?사실은 그렇지 않 습 니 다. 더 많은 것 은 잘못된 사용 으로 인 한 것 입 니 다. 왜냐하면 당신 은 calling scope 가 있 는 문맥 에서 '정적 형식' 을 사용 하여 비 정적 방법 을 호출 했 기 때 문 입 니 다.
    그럼 PHP 는 왜 이렇게 디자인 했 어 요?아래 의 예 를 고려 하 다.
        <?php
         class A {
            public function __construct() {
            }
         }
          class B extends A {
            public function __construct() {
                parent::__construct();
           }
           }
    우리 가 부모 류 의 구조 함 수 를 호출 할 때 우 리 는 현재 의 scope 를 부모 류 의 구조 함수 에 전달 하려 고 의도 적 으로 calling scope 로 한다.

    좋은 웹페이지 즐겨찾기