簡體   English   中英

從__callStatic調用私有靜態方法

[英]Calling a private static method from __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');

也許有人正在解決方案:-)

這也有效

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可以起作用。

這有效

    <?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');

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM