为什么PHP更喜欢__call()到__callStatic()?

时间:2016-03-21 18:36:49

标签: php

当我尝试这个时:

<?php
class myParent {
    public function __call($method, $params) {
        echo "from __call";
    }

    public function __callStatic($method, $params) {
        echo "from __callStatic";
    }
}

class mySon extends myParent {
    public function bar() {
        myParent::foo();
    }
}

(new mySon())->bar();

我希望这个输出:from __callStatic ...

取而代之的是:from __call

有人能解释我为什么吗?

编辑:确切地说,我想知道为什么如果我删除__call功能,那么它会触发__callStatic,如果有办法触发__callStatic宣布__call时。

3 个答案:

答案 0 :(得分:3)

这里发生了两件事,首先:PHP支持classname::method作为parent::method别名,以及一种跳过树中某些类的方法{{3} }。

其次,parent::不是静态调用,并且使用parent::classname::无法静态调用父项上的方法。我实际上打开了一个as demonstrated here,但这并没有触发任何开发人员更好地做到这一点。

这两种结合导致了您所看到的非直观行为

答案 1 :(得分:2)

您静态调用函数,但是从类的实例中调用。所以PHP称为基于__call()的实例。请注意,此代码在功能上与您静态编写的代码相同

class mySon extends myParent {
    public function bar() {
        $this->foo(); // works the same way as myParent::foo();
    }
}

如果你这样称呼它,你就会得到静态(注意,__callStatic()必须是静态的)

class myParent {
    public function __call($method, $params) {
        echo "from __call";
    }

    public static function __callStatic($method, $params) {
        echo "from __callStatic";
    }
}
myParent::foo();

答案 2 :(得分:0)

好吧,我找到了一个明显的解决方案,我想做什么:

class mySon extends myParent {
    public function bar() {
        myParent::__callStatic('foo', array());
    }
}