0

我想使用 __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');

也许有人有解决方案:-)

4

3 回答 3

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() 调用的,因此超出了范围。

第二个问题是 self:: 的使用,虽然我无法充分解释为什么我害怕(也许更精通细微差别的人可能会有所启发?),但是用static关键字替换 self 是有效的。

于 2012-05-19T12:42:06.780 回答
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');
于 2012-05-19T09:16:47.267 回答