当我尝试这个时:
<?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
时。
答案 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());
}
}