PHPStorm抱怨__CallStatic facade

时间:2015-09-21 19:59:32

标签: php phpstorm phpdoc laravel-facade

我有静态方法的类,我需要将其更改为单元测试的实例方法。但是,我无法更改静态调用它们的代码。所以我正在尝试实现一个外观(类似于Laravel所做的),以便我可以静态和动态地调用这些函数。我的代码本身正在运行,但PHPStorm正在抱怨静态调用。这是我的Facade类,带有测试子类和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);
    }
}

我在TestMethod1方法上尝试在Foo和@static上使用phpdoc @method,但似乎都不起作用。如何让PHPStorm停止抱怨静态调用?除了关闭检查之外,还有办法解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

  

我的代码本身正在运行,

只有在$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