아래 코드가 "테스트"를 두 번 인쇄하는 이유를 알지 못합니다.정적 함수 내부에 PHP가 오버로드되지 않음
<?php
class A {
private $test = "TEST<br />";
public static function getInstance() {
return new self();
}
public static function someStaticMethod() {
$a = new self();
$a->test;
}
public function __get($args) {
echo $this->$args;
}
}
/* echo's "TEST" */
$a = new A();
$a->test;
/* echo's "TEST" */
$a2 = A::getInstance();
$a2->test;
/*
No output... eeerhm... how come?
Why is $a->test (inside someStaticMethod()) not being overloaded by __get ??
*/
A::someStaticMethod();
?>
PHP 사이트 (link)를 말한다 :
재산권 오버로드 만 개체 컨텍스트에서 작동합니다. 이러한 마법 메서드는 정적 인 상황에서 트리거되지 않습니다. 따라서 이러한 메서드는 정적으로 선언하면 안됩니다. PHP 5.3.0부터 매직 오버로딩 메소드 중 하나가 정적으로 선언되면 경고가 발생합니다.
하지만 나는 그들이 마법의 방법을 정적이라고 선언해야한다고 생각합니다. 예컨대 :
공공 정적 함수 __get() {}
플러스 사실 내가 개체 컨텍스트에서 사용 사실에 오전. $ a = 새로운 자기(); 변수 $ a에있는 클래스 A의 인스턴스를 반환합니다. 그럼 난 (개체 컨텍스트 IMO?) $ A-> 테스트를 사용하고 다시 과부하 취득해야 개인 "테스트"변수 ... 난 혼란 스러워요
... manual에서
나는 내가 수락 한 두 사람 모두 투표 할 수 있습니다. :(.하지만 어떻게 정적 메서드 someStaticMethod()에서 $ 테스트 액세스 할 수있을 것이라고? "현재 범위에서 볼 수"얻을.하지만 정적 컨텍스트 오른쪽에서 인스턴스 인스턴스 컨텍스트에 액세스 할 수 없습니까? 그래서 실제로 실 거예요 SomeStaticMethod()에서 직접 $ test에 액세스 할 수 있습니까? Anywayz ... 게으른 로딩을 위해 오버로드를 사용하고 있기 때문에 * ss에 약간의 고통이 있습니다.이 점이 나에게 상당히 부담 스럽습니다 ... 그것? – Marc
@ 마르크 당신은 할 수 없다. 그러나 나는이 대답을 정당한 신용으로주기 위해 upvoted. 우리는 다른 방법으로 같은 결론에 도달했다. – bfavaretto