PHPStorm жалуется на статический вызов метода экземпляра, обрабатываемого фасадом __CallStatic

У меня есть классы со статическими методами, которые мне нужно изменить на методы экземпляра для модульного тестирования. Однако я не могу изменить код, который вызывает их статически. Итак, я пытаюсь реализовать фасад (аналогично тому, что делает Laravel), чтобы я мог вызывать функции как статически, так и динамически. Сам мой код работает, но PHPStorm жалуется на статические вызовы. Вот мой класс фасада с тестовым дочерним классом и тестом phpunit:

abstract class Facade
{
    /**
     * Handle dynamic, static calls to the object.
     *
     * @param string $method
     * @param array $parameters
     * @return mixed
     */
    public static function __callStatic($method, $parameters)
    {
        $instance = new static;
        return call_user_func_array([$instance, $method], $parameters);
    }
}

class Foo extends Facade
{
    /**
     * @param string $param1
     * @return string
     */
    public function TestMethod1($param1)
    {
        return 'Test: '.$param1;
    }
}

class FooTest extends \PHPUnit_Framework_TestCase
{
    public function testFacade()
    {
        $param1 = 'ok';
        $result = Foo::TestMethod1($param1);
        $this->assertEquals('Test: '.$param1, $result);
    }
}

Я пробовал использовать phpdoc @method для Foo и @static для метода TestMethod1, но ни один из них не работает. Как я могу заставить PHPStorm перестать жаловаться на статические вызовы? Есть ли способ справиться с этим, кроме как отключить проверку?


person Revent    schedule 21.09.2015    source источник
comment
Как мне заставить PHPStorm перестать жаловаться на статические вызовы? Отключить эту конкретную проверку. В противном случае я не вижу другого выхода.   -  person LazyOne    schedule 21.09.2015


Ответы (1)


Сам мой код работает,

Это работает только потому, что вы не используете $this внутри TestMethod1 и не запускаете тест в строгом режиме.

__callStatic никогда не вызывается, потому что Foo::TestMethod1() ссылается на существующий метод, даже если он не объявлен статическим.

Попробуйте:

https://3v4l.org/rsR71

class T
{
    public static function __callStatic($method, $args)
    {
        echo "__callStatic() called\n";
    }
    public function f()
    {
        echo "f() called\n";
    }
}

T::f();

Вывод для hhvm-3.6.1 - 3.9.0

f() called

Вывод для 7.0.0alpha1 - 7.0.0rc3

Deprecated: Non-static method T::f() should not be called statically in /in/rsR71 on line 15
f() called

Вывод для 5.4.8 - 5.6.13

Strict Standards: Non-static method T::f() should not be called statically in /in/rsR71 on line 15
f() called
person Fabian Schmengler    schedule 22.09.2015
comment
Спасибо за понимание. Я не понимал, что существующая динамическая функция вызывается через статический вызов. - person Revent; 22.09.2015