PHPStorm 提示由 __CallStatic 门面处理的实例方法的静态调用

标签 php phpstorm phpdoc laravel-facade

我有一些带有静态方法的类,我需要将其更改为实例方法以进行单元测试。但是我无法更改静态调用它们的代码。所以我试图实现一个外观(类似于 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);
    }
}

我尝试在 Foo 上使用 phpdoc @method,在 TestMethod1 方法上使用 @static,但似乎都不起作用。如何让 PHPStorm 停止提示静态调用?除了关闭检查之外还有其他方法可以处理这个问题吗?

最佳答案

My code itself is working,

它之所以有效,是因为您没有在 TestMethod1 中使用 $this 并且没有在严格模式下运行测试。

__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

关于PHPStorm 提示由 __CallStatic 门面处理的实例方法的静态调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32703546/

相关文章:

php - 仅在用户上传新图像时更新图像,Laravel

php - 查询不返回结果,但手动执行时返回结果

PHP fatal error : Call to a member function item() on a non-object

PhpStorm 将局部变量重构为类字段

php - 默认情况下,PhpStorm 中的自动缩进类似于 WebStorm

svn - 如何在phpstorm中关闭 "Unused definition violation"

PHPDoc 或类型提示类作为方法的参数

php - 从字段php mysql中拆分和提取数据

php - 在@param 中使用命名空间

PHP 类型提示 - 代码与注释