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); –

相关问题