2

単体テスト用にインスタンス メソッドに変更する必要がある静的メソッドを持つクラスがあります。ただし、それらを静的に呼び出すコードを変更することはできません。そのため、関数を静的および動的に呼び出すことができるように、ファサードを実装しようとしています (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 が静的呼び出しについて文句を言わないようにするにはどうすればよいですか? インスペクションをオフにする以外にこれを処理する方法はありますか?

4

1 に答える 1

2

私のコード自体は機能していますが、

$this内部で使用TestMethod1せず、厳密モードでテストを実行しないため、機能しているだけです。

__callStaticstatic と宣言されていなくても、既存のメソッド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
于 2015-09-22T19:08:15.063 に答える