2013-06-01 3 views
1

매직 메서드를 통해 실행되는 정적 메서드를 호출하는 함수를 만드는 클래스가 있습니다. 문제는 기능이 한 그들을 호출하는 클래스보다는 클래스의 다른 유형에서 그대로 작동하지만 내가 같은 클래스의 정적 함수를 호출하는 경우 모든 기능이 반환됩니다입니다 1.매직 정적 함수에 문제가 있음

class Test { 
    public function static __callStatic($name, $params) { 
     return 2; 
    } 
    public function __call($name, $params) { 
     return 1; 
    } 
    public function Test1() { 
     return Test::GetTwo(); 
    } 
} 
class Test2 { 
    public function Test() { 
     return Test::GetTwo(); 
    } 
} 
$t = new Test(); 
echo $t->Test1(); //prints 1 should be 2 
$t2 = new Test2(); 
echo $t->Test(); //prints 2 as it should 

경우에도 정적 메서드 GetTwo() Test1() 같은 범위에서 함수를 호출하는 경우 여전히 1 얻을 개체를 반환합니다. 어느 누구도이 문제에 빠지니?

답변

1
echo Test::Test1(); 

당신은 정적 메서드를 호출 할 인스턴스를 필요로하지 않는다 (도 사용한다). 클래스 및 범위 분석 연산자 (: :)를 사용하여 호출합니다.

당신이 인스턴스에 메소드 호출 late static binding 사용 static::Test1();

필요한 경우, PHP는 다음을 시도합니다

  1. 는 인스턴스 메서드의 이름 X.
  2. 마법의 방법 __call 찾기를 찾을 수 있습니다.
  3. X라는 클래스 (정적) 메소드를 찾으십시오.
  4. 마법 계급 (정적) 메소드 __callStatic을 찾으십시오.

귀하의 경우, 2 단계에서 __call을 찾아서 처리합니다.

+0

그런데 당분간 __callStatic을 실행하기 위해 __call 함수에서 리디렉션을 넣을 것입니다. 그것이 정적이라고 부르는 것을 알고 있다고 생각하면 __callStatic을 먼저 시도 할 것입니다. –

+0

은 리디렉션이 작동하는 것처럼 보입니다. PHP가 기능을 찾는 방법의 순서를 지적 해 주셔서 감사합니다. 솔루션을 찾는데 도움이되었으므로 답변을 드리겠습니다. –

+0

self :: $ 변수를 사용하여 현재 클래스의 정적을 호출합니다. 클래스 이름 :: $ 변수 –