2012-09-06 3 views
4

아래 코드가 "테스트"를 두 번 인쇄하는 이유를 알지 못합니다.정적 함수 내부에 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에서

답변

2

A:: someStaticMethod의 컨텍스트에서 PHP는 개인 변수 $test에 직접 액세스 할 수 있으므로 마법 메서드가 실행되지 않습니다. 거기에서 echo $a->test;이 있으면 액세스중인 것을 볼 수 있습니다. PHP Manual에 따라 예상되는 동작입니다

: 그들은 같은 인스턴스가없는 경우에도 동일한 유형의

객체는 서로의 개인 보호 멤버에 액세스 할 수 있습니다. 이는 구현 세부 정보가 해당 객체 내부에있을 때 이미 알려져 있기 때문입니다.

3

를 가져 : 선언되지 또는 현재 범위에 표시되지 않은 성질 또는 방법들과 상호 작용할 때

오버로딩

메소드가 호출된다.

정적 메서드 someStaticMethod()을 호출 할 때 private $ test가 현재 범위에서 볼 수 있으므로 마법 __get 메서드가 호출되지 않습니다.

+0

나는 내가 수락 한 두 사람 모두 투표 할 수 있습니다. :(.하지만 어떻게 정적 메서드 someStaticMethod()에서 $ 테스트 액세스 할 수있을 것이라고? "현재 범위에서 볼 수"얻을.하지만 정적 컨텍스트 오른쪽에서 인스턴스 인스턴스 컨텍스트에 액세스 할 수 없습니까? 그래서 실제로 실 거예요 SomeStaticMethod()에서 직접 $ test에 액세스 할 수 있습니까? Anywayz ... 게으른 로딩을 위해 오버로드를 사용하고 있기 때문에 * ss에 약간의 고통이 있습니다.이 점이 나에게 상당히 부담 스럽습니다 ... 그것? – Marc

+0

@ 마르크 당신은 할 수 없다. 그러나 나는이 대답을 정당한 신용으로주기 위해 upvoted. 우리는 다른 방법으로 같은 결론에 도달했다. – bfavaretto