92

notepad ++と崇高なコーディングで何年も幸せに過ごした後、PHPIDEを試してみるようにアドバイスされました。phpStormを試していますが、良さそうです。コードの完成とドキュメント化は素晴らしい機能ですが、魔法のメソッドを使用するとうまくいきません。phpStormに魔法のメソッドで何が起こっているのかを理解させるための回避策はありますか?

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

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はこれらのステートメントの最初のステートメントのみを取得しています。さらに、return typeをmixedに設定することしかできません。これは、これが呼び出されたクラス(私の例ではb)として設定できるようにするためです。

どんなアイデアや提案も非常にありがたく受け取られます、ありがとう。

4

2 に答える 2

159

クラスレベルの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 PhpStorm(メソッドが静的であることをIDEに通知)では正常に動作しますが、実際の phpDocumentor@method staticツールでは(まだ?)サポートされていない可能性があります(申し訳ありませんが、しばらく使用していません)。


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


@property/タグの正規表現/部分名の使用に関するphpDocumentorのチケット@method(ドキュメントにどのように役立つか、コード補完を処理するときに実際のIDEにどの程度役立つか):

于 2013-03-26T10:17:12.370 に答える
6

元の質問にいくらか関連しています:

これは、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();

このようにして、魔法が起こったときにすべての可能性をdocblockする必要はありません。

詳細については、いくつかのドキュメントがあります。

于 2016-11-27T10:28:35.460 に答える