web-dev-qa-db-ja.com

IDEのマジック(__callおよび__callStatic)メソッドをドキュメント化する方法

たくさんの幸せな年にnotepad ++と崇高でコーディングした後、PHP IDE試してみてください。ニース。コード補完とドキュメントは素晴らしい機能ですが、マジックメソッドが使用されている場合はうまくいきません

私たちの状況は次のようなものです。

abstract class a {
    public static function __callStatic($method,$args)
    {
        if(strpos($method,"get_by_") === 0)
        {
            //do stuff
        } elseif(strpos($method,"get_first_by_") === 0) {
            //do stuff
        } elseif($method == "get_all") {
            //do stuff
        }
    }
}

class b extends a {
    // some more stuff
}

b::get_by_user_id(27);
b::get_first_by_id(156);
b::get_all();

魔法のcallStaticメソッドを使用すると、関数呼び出しを構成する1つ以上の引数を介してオブジェクトのコレクションを取得できます。

これらの場合に使用する@methodステートメントがありますが、phpStormはこれらのステートメントの最初のもののみをピックアップしていることがわかります。さらに、戻り型を混合に設定できるのは、これが呼び出されたクラス(この例ではb)として設定できるようにすることです。

どんなアイデアや提案も非常にありがたいことに、感謝します。

75
Rob Forrest

クラスレベルのPHPDocコメントを使用します-具体的には@ methodタグ-PhpStormで正常に動作します:

/**
 * @method static someClass get_by_user_id(int $id) Bla-bla
 * @method static someClass get_first_by_id(int $id) 
 */
abstract class a {
...

上記で:

  • @method-PHPDocタグ
  • static-これが静的メソッドであることを示します
  • someClassまたは$this-戻り型
  • get_by_user_id-メソッド名
  • (int $id)-メソッドシグネチャ:([[type] [parameter]<, ...>])
  • Bla-bla-オプションの説明

@methodの詳細:

PS@method staticはPhpStormで正常に動作します(tells IDEそのメソッドは静的です) (まだ?)実際のphpDocumentorツールでサポートされています(申し訳ありませんが、しばらく使用していません)。


あるいは:(もちろんPhpStormで)Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class-そのようなメソッドのコード補完には何の助けにもなりませんが、これらのマジックメソッドを「未定義メソッド」エラーとしてマークしないでください。


phpDocumentorのチケット@property/@methodタグのRegEx /部分名の使用に関する説明実際のIDEコード補完を処理するとき)にもたらす可能性があるヘルプ:

134
LazyOne

元の質問にある程度関連している:

Phpstormメタファイルでこれを定義することもできます。ファクトリメソッド(v2016.3)の例を次に示します。

// Define in .phpstorm.meta.php
namespace PHPSTORM_META {
    $STATIC_METHOD_TYPES = [
        \Factory::create('') => [],
    ];
}

// Then use in code
$factory = new \Factory();
$user = $factory->create(\User::class);
// Here you get autocomplete.
$user->subscribe();

この方法では、マジックが発生したときにすべての可能性をドックブロックする必要はありません。

詳細については docs を参照してください。

4