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 перестать жаловаться на статические вызовы? Есть ли способ справиться с этим, кроме отключения проверки?
1 ответ
Сам мой код работает,
Это работает только потому, что вы не используете $this
в TestMethod1
и не запускайте тест в строгом режиме.
__callStatic
никогда не называется, потому что Foo::TestMethod1()
ссылается на существующий метод, даже если он не объявлен как статический.
Попробуйте это:
class T
{
public static function __callStatic($method, $args)
{
echo "__callStatic() called\n";
}
public function f()
{
echo "f() called\n";
}
}
T::f();
Выход для ччвм-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