PHP 의 Calling Scope
문 제 는 여기 있 습 니 다: 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 로 한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.