我正在开发一个自定义 ORM,下面是一个演示该问题的简化示例:
class Foo {
public static function __callStatic($name, $args){
if($name == "getBar"){
return "Bar";
}
return NULL;
}
public function __call($name, $args){
if($name == "getFoo"){
$model = "Foo";
$method = "getBar";
return $model::$method();
}
return NULL;
}
}
class Foo2 {
public function __call($name, $args){
if($name == "getFoo"){
$model = "Foo";
$method = "getBar";
return $model::$method();
}
return NULL;
}
}
echo Foo::getBar();//Bar
$foo = new Foo;
var_dump($foo->getFoo()); //Null though I'm expecting Bar
$foo = new Foo2;
var_dump($foo->getFoo()); //Bar
那么为什么在 Foo 内部调用相同的方法会触发 __call
而在 Foo2
内部调用时会触发 __callStatic
?
最佳答案
那是因为在第一次调用时返回 Null
,并且处于对象上下文中。所以它调用的是 __call()
而不是 __callStatic()
。
编辑: 在第一种情况下, Foo::getBar() 在 Foo 类实例的范围内调用,因此 Foo::getBar() 实际上与 (instance) 相同->getBar() 这当然不是静态调用。
编辑2:刚刚找到一个关于您的问题的问题+答案:Why does PHP prefer __call() to __callStatic()?
关于PHP:调用 __call 而不是 __callStatic,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747614/