30

コールバックをパラメーターとして受け入れるメソッドがあります。IDE (PHPStorm) がメソッドに渡される関数の有効な型ヒントを生成できるように、そのメソッドに渡されるコールバック関数のパラメーターを概説するクラス メソッドの PHPDoc に署名を提供したいと考えています。少なくともコードを見ている人は、提供しようとしているコールバックのシグネチャを判断できます。

例えば:

class Foo {
  public $items = [];
  /**
  * @param Callable(
  *   @param ArrayObject $items The list of items that bar() will return
  * ) $baz A callback to receive the items
  **/
  public function bar(Callable $baz) {
    $items = new ArrayObject($this->items);
    $baz($items);
  }
}

このメソッドには、コールバック関数であるbar1 つのパラメーターがあります。$bazにパラメーターとして渡される関数は、唯一のパラメーターとして をbar()受け入れる必要があります。ArrayObject

Callable他のメソッドと同様に、に複数のパラメータを含めることができることが理想的です。

次のコードを書くと:

$foo = new Foo();
$foo->bar(function(

ArrayObject...次に、この関数呼び出しで受け入れられたパラメーターの型 ( ) を正しく示唆するパラメーター リストを受け取る必要があります。

そのようなことは可能ですか?PHPStorm または別の IDE はそれをサポートしていますか? IDE サポートがない場合でも、これを文書化する推奨/標準的な方法はありますか?

4

3 に答える 3

4

static functionを使用してクラス内でを定義することにより、この問題を克服しましたcallable。その関数には独自の doc-block があり、PHPDoc の@seeタグを使用して callable を必要とするメソッドでそれを参照するだけです。

class Foo
{
    /**
     * Description of the "bar" callable. Used by {@see baz()}.
     *
     * @param int $index A 1-based integer.
     * @param string $name A non-empty string.
     * @return bool
     * @see baz()
     * @throws \Exception This is a prototype; not meant to be called directly.
     */
    public static barCallable($index, $name)
    {
        throw new \Exception("barCallable prototype called");
    }

    /**
     * Description of the baz() method, using a {@see barCallable()}.
     *
     * @param callable $bar A non-null {@see barCallable()}.
     * @see barCallable()
     */
    public function baz(callable $bar)
    {
        // ...
        call_user_func($bar, 1, true);
        // ...
    }
}

これは PhpStorm 10 でうまく機能します。クイック ドキュメントを使用すると、メソッドのドキュメントからプロトタイプのドキュメントに簡単に移動できます。

プロトタイプ関数が呼び出されることを意図していないことを明確にするために、例外をスローします。protectedorスコープを使用できますprivateが、PHPDoc は常にドキュメント生成用のドキュメント ブロックを選択するとは限りません。

残念ながら、PhpStorm はコールバックの使用を追跡できません。コールバックを必要とするメソッドを使用する場合もパラメータ情報は提供されませんが、コールバックは少なくとも正式に文書化されています。

このアプローチには、実行時にプロトタイプのリフレクションからコールバック定義を検証するという追加の利点もあります。

于 2016-02-08T15:51:07.543 に答える
3

現在、PhpStormでは不可能です。私は他の手段で比較的同じことをする他の解決策を考えることさえできません。

于 2012-12-12T01:42:58.023 に答える