0

設定

内部SomeClassにはf2member、2 つの整数引数を取り、その合計を生成します。呼び出しが実際に機能し、期待される結果を取得することを示すテストに合格します。$gこれは、2 つのパラメーターを指定して呼び出し、11返し2ます。

重要: これは、php 5.4.11 以降の 互換性チェックでのみ機能します。

class SomeClass extends PHPUnit_Framework_TestCase
{   
    function f2member($a,$b)
    {
        return $a + $b;
    }

    /**
     * @test
     */
    public function test()
    {
        $g = array($this,'f2member');
        $this->assertEquals(2, $g(1,1)); // squiggle line under $g
    }
}

問題

ただし、これにより、すべてのメソッド呼び出しで phpStorm 内に警告が生成され、下に波線が表示されます$g

phpStorm の波線警告

関数名は呼び出し可能でなければなりません - 文字列、クロージャ、または __invoke を実装するクラス、現在は配列

警告の原因は明らかであり、現在、これらの警告を回避する方法を探しています。要件は、関数を呼び出すスタイルを変更したくないということです。もう 1 つやりたくないことは、この警告を無効にすることです。必要な情報を型システムに提供する何かをラップすることをお勧めします。

試み

警告を削除するためのいくつかの解決策に既に遭遇しました。1 つは、必要なターゲット タイプのみを文書化するユーザー定義関数を定義することです。

/**
 * @param array $arr
 *
 * @return callable
 */
function callable_for($arr)
{
    return $arr;
}

これは配列を返しますが、関数から何が得られるかを型システムに明示的に伝えcallable_forます。この型注釈を配置すると、phpStorm はこの警告について不平を言うのをやめますが、それでも配列を返します。

$g = callable_for(array($this,'f2member'));

質問

callable_forこれを達成するためにphpで私のような箱から出してすぐに使えるものはありませんか? 答えが「いいえ」の場合、見つけられる最も簡潔な解決策を探しています。

私はすでにSO、php.net、googleを見てみました。間違った単語の組み合わせを検索しただけかもしれません。ここに 2 つのサンプルを示します。

  • 呼び出し可能なphpへの配列
  • 呼び出し可能なメソッド ハンドル php を作成する

大局

疑いが生じた場合に備えて、これはX/Y 問題です。呼び出し可能オブジェクトをパラメーターとして取る別の関数があります。クロージャーでは、後で呼び出すことができる何かを定義することは非常に自然です。ただし、別の委譲クロージャーでラップせずに、メンバーまたは静的メソッドの呼び出し可能オブジェクトを定義するにはどうすればよいですか? 配列表記を使用すると、後の関数にクロージャーまたは静的/メンバー メソッド ハンドルを均一に渡すことができます。私は今、これに近い簡潔な解決策を見つけようとしています

4

2 に答える 2

0

callable_forしたがって、別の進歩は、 2 つの引数を取り、両方の責任をラップするように変更することです。配列を作成し、ターゲットの戻り値の型を文書化します。

/**
 * @param mixed $context
 * @param string $method
 *
 * @return callable
 */
function callable_for($context, $method)
{
    return array($context, $method);
}

この実装を使用すると、 の宣言の簡潔さが$g許容レベルまで上がります。

$g = callable_for($this,'f2member');

この関数は引き続き配列を返しますが、型システムは指定された情報を使用して、この配列を動的メソッド呼び出しに対して正しく処理できます。

于 2016-01-05T21:25:08.980 に答える