我想使用__callStatic作为preProcessor来调用静态方法。我的想法是将方法设为私有,以便每个静态调用都转发给__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 :(得分: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()调用的,因此超出了范围。
第二个问题是使用自我::虽然我不能提供足够的解释为什么我害怕(或许更精通细微差别的人可能会有所帮助?),但用{{1}代替自我}关键字有效。
答案 1 :(得分: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');
答案 2 :(得分:0)