PHP:为什么在类本身内部静态调用类函数会解析为__call而不是__callStatic?

问题描述 投票:0回答:1

我试图理解为什么当从同一个类中静态调用函数时,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 : CoolFunction
__callStatic : CoolFunction
__callStatic : CoolFunction
__callStatic : CoolFunction
__callStatic : CoolFunction

__ call

不可用时,__ callStatic被正常调用,这不像用于静态调用非静态函数的常规回退,因为那样会抛出“非静态函数被静态调用...”警告,但并非如此。我试过使用self ::static ::甚至get_drawn_class()::都与Foo ::相同,但是不起作用。

临时/破解解决方案将直接调用__ callStatic

,但这不是我想要的。

这是工作的预期方式吗?如果是这样,在任何地方都有记录吗?

[我试图理解为什么在同一个类中静态调用函数时PHP为什么更喜欢__call而不是__callStatic,并且我已经对其进行了一些研究并发现了一些类似的问题,但是...

php static
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.