PHP: Почему статический вызов функции класса внутри самого класса разрешается в __call, а не в __callStatic? - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь понять, почему 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_called_class () :: , что совпадает с Foo :: В любом случае, но не работает.

временное хаки решение будет вызывать __ callStatic напрямую, но это не то, что я ищу.

Этопредполагаемый способ для вещей работать? если да, это где-нибудь задокументировано?

...