0

静的メソッドを呼び出すための preProcessor として __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() から呼び出されるため、スコープ外です。

2 番目の問題は、self:: の使用です。なぜ私が恐れているのかを十分に説明することはできませんが (おそらく、ニュアンスに詳しい人が何らかの光を当てるのではないでしょうか?)、self をstaticキーワードに置き換えることは機能します。

于 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 に答える