0

我想使用__callStatic作爲調用靜態方法的預處理器。我的想法是使這些方法是私人的,所以每個靜態調用都被轉發給__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

反射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'); 

的第一個問題你原來的正在讓你的方法變得私密。私有方法只在當前類(在這種情況下爲B :: test())的作用域中,但是該方法從A :: __ callStatic()中調用,因此超出了範圍。

第二個問題是自我使用::雖然我不能提供足夠的解釋爲什麼我害怕(也許有人更細緻的細微差別可能會揭露一些光?),但取代自我與static關鍵字作品。

+0

你的解決方案真的很聰明。謝謝。我從來沒有讀過靜態關鍵字:-( –

+0

)如果你從來沒有讀過靜態關鍵字,那麼你怎麼能調用一個靜態函數呢?你在發佈的問題中可能有錯誤的意圖。我想,只要該函數沒有在類中定義,並且即使如此,可能也有一種方法不是直接在PHP中,我認爲對我沒有太大的區別:P – Jay

+0

我的意思是call_user_func_array中的'static ::' static ::'。$ method,$ params); –

相關問題