0

정적 메서드를 호출하기위한 전 처리기로 __callStatic을 사용하고 싶습니다. 내 생각은 메서드를 private으로 만들어 모든 정적 호출을 __callStatic에 전달하는 것입니다. 그런 다음이 방법을 사용하여 몇 가지 작업을 수행하고 그 방법을 호출 할 수 있습니다. 그러나 그것은 불가능한 것처럼 보입니다.__callStatic에서 개인 정적 메서드 호출

class A { 

    public static function __callStatic($name, $params) { 
     var_dump($name); 

     // TODO call the private function from class B here 

     //call_user_func_array('self::' . $name, $params); //infinite loop 

    } 

} 

class B extends A { 

    private static function test($bar) { 
     echo $bar; 
    } 

} 

B::test('foo'); 

은 아마도 누군가가

+0

forward_static_call_array (array (self, $ name), $ params); 루프도 –

+0

* (팁) * http://kore-nordmann.de/blog/0103_static_considered_harmful.html – Gordon

+0

고든 고든. 일치하지 않지만 읽을만한 가치가 있습니다 –

답변

0

:-) 솔루션을 데이

<?php 
/** 
* Created by JetBrains PhpStorm. 
* User: ckoch 
* Date: 19.05.12 
* Time: 10:43 
* To change this template use File | Settings | File Templates. 
*/ 

class A { 

    public static function __callStatic($name, $params) { 
     var_dump($name); 

     // TODO call the private function from class B here 

     //call_user_func_array('self::' . $name, $params); //infinite loop 

     //forward_static_call_array(array(self, $name), $params); // loops too 

     $method = new ReflectionMethod(get_called_class(), $name); 
     $method->setAccessible(true); 
     $method->invokeArgs(null, $params); 

    } 

} 

class B extends A { 

    private static function test($bar) { 
     var_dump($bar); 
    } 

} 

B::test('foo'); 
+1

이것이 해결책이라면 디자인을 다시 생각해보십시오. – Gordon

+0

Reflection API는 매우 고가입니다. 고든이 생각한 것을 재고해야한다고 말했기 때문입니다. –

+0

위의 Crips 솔루션이 맞습니다. –

1

이 원래와

class A 
{ 
    public static function __callStatic($method, $params) 
    { 
     return call_user_func_array('static::'.$method, $params); 
    } 
} 
class B extends A 
{ 
    protected static function test($value) 
    { 
     echo $value; 
    } 
} 
B::test('foo'); 

도 첫 번째 문제를 작업, 예를 들면 : 귀하의 방법을 비공개로 만들고 있습니다. private 메서드는 현재 클래스 (이 경우 B :: test())의 범위에만 있지만 메서드는 A :: __ callStatic()에서 호출되므로 범위를 벗어납니다.

두 번째 문제는 self : : 왜 내가 두려워하는지에 대한 적절한 설명을 제공 할 수는 없지만 (어쩌면 뉘앙스에 더 정통한 누군가가 약간의 빛을 발산 할 수 있겠는가?), 자기를 static 키워드로 대체 할 수 있습니다. .

+0

솔루션이 정말 똑똑합니다. 고맙습니다. 정적 키워드에 대해 읽은 적이 한번도 없었습니다 :-( –

+0

정적 키워드에 대해 읽은 적이 없다면 정적 함수를 어떻게 호출 할 수 있습니까? 게시 된 질문에 잘못된 의도가 있었을 가능성이 높습니다. 필자가 생각하기에, 함수가 클래스에서 정의되지 않았고, 그렇다고해도 PHP에서 직접적으로 사용할 수있는 방법이없는 한,별로 다르지 않습니다. P – Jay

+0

call_user_func_array (' static :: '. $ method, $ params); –