我试图理解为什么当从同一个类中静态调用函数时,PHP为什么更喜欢__ call而不是__ callStatic,并且我对此进行了一些研究并发现了一些类似的问题,但是没有一个确实很好地回答了这个问题。
以下面的代码为例:
<?php
class Foo
{
public function __call($name, $arguments)
{
echo "<strong>__call : </strong>".$name.'<br>';
}
public static function __callStatic($name, $arguments)
{
echo "<strong>__callStatic : </strong>".$name.'<br>';
}
public function DoTheThing()
{
Foo::CoolFunction();
static::CoolFunction();
self::CoolFunction();
get_called_class()::CoolFunction();
}
}
// Calling from outside ..
Foo::CoolFunction();
// Calling Something that will call from the inside ..
$instance = new Foo;
$instance->DoTheThing();
?>
以下代码将产生此输出:
__callStatic : CoolFunction
__call : CoolFunction
__call : CoolFunction
__call : CoolFunction
__call : CoolFunction
我已经读过某个地方,从实例内部进行的调用被视为“非静态上下文”,因此将解析为__ call而不是__ callStatic直到我尝试删除生成此输出的__ call函数,这才有意义
不可用时,__ callStatic被正常调用,这不像用于静态调用非静态函数的常规回退,因为那样会抛出“非静态函数被静态调用...”警告,但并非如此。我试过使用self ::和static ::甚至get_drawn_class()::都与Foo ::相同,但是不起作用。__callStatic : CoolFunction __callStatic : CoolFunction __callStatic : CoolFunction __callStatic : CoolFunction __callStatic : CoolFunction
当__ call
临时/破解解决方案将直接调用__ callStatic
,但这不是我想要的。这是工作的预期方式吗?如果是这样,在任何地方都有记录吗?
[我试图理解为什么在同一个类中静态调用函数时PHP为什么更喜欢__call而不是__callStatic,并且我已经对其进行了一些研究并发现了一些类似的问题,但是...