簡體   English   中英

PHPStorm 抱怨由 __CallStatic 門面處理的實例方法的靜態調用

[英]PHPStorm complains about static call of instance method handled by __CallStatic 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 停止抱怨靜態調用? 除了關閉檢查之外,還有其他方法可以處理嗎?

我的代碼本身正在工作,

它之所以有效,是因為您不在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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM