__call优先于__callStatic

时间:2014-04-09 09:43:52

标签: php function magic-methods

我注意到以下每个示例都会回显__call

class A {
    public function __construct() {
        $this->something();
        self::something();
        call_user_func(array("self", "something"));
        forward_static_call(array("self", "something"));
        A::something();
        call_user_func(array(__CLASS__, "something"));
        forward_static_call(array(__CLASS__, "something"));
    }

    public function __call($name, $arguments) {
        echo __FUNCTION__ . "<br />";
    }

    public static function __callStatic($name, $arguments) {
        echo __FUNCTION__ . "<br />";
    }

}

new A();

是否可以从对象上下文中调用__callStatic方法,即使类中存在__call魔术方法?

我发现call_user_func(array(__CLASS__, "__callStatic"), array("method"), array());有些难看。

1 个答案:

答案 0 :(得分:2)

静态上下文中调用无法访问的方法时会触发

__callStatic()

但是当您从非静态上下文(在您的代码中,foo::bar()方法是非静态上下文)__construct时,非静态调用,除非该函数明确定义为静态

因此,如果您真的想在__callStatic()方法中使用__construct,则可以直接使用它。

public function __construct() {
    self::__callStatic('something', array());
}