2013-03-26 1 views
56

メモ帳++でコード化して崇高なことを何年も幸せにしてから、私はPHP IDEを試してみることを勧めました。私はphpStormを試しているし、それはいいようです。コードの補完と文書化は素晴らしい機能ですが、魔法を使うときはうまくいきません。 phpStormに魔法の仕組みがどういうものなのかを理解させるための回避策はありますか?IDEのマジック(_callと_callStatic)メソッドを文書化するには

私たちの状況はこのようなものです:

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)として設定できることが望ましいからです。

感謝と感謝の意を表します。

+1

WHY WOULD _ANYONE_「_call」を無視すると、良いアイデアとなると思いますか? –

+0

正気の人がこの質問を見つけた場合、ブライアンのコメントを+1してください。マジックメソッドは、すべての目的と目的のためにあります:IDEではなく(マジックメソッドをデバッグするようにしてください)、リファクタリングに弾力を持たずに(ドキュメンテーションを(n)[パラメータ|前提条件| (元気なソフトウェアでリファクタリングを試みることさえ考えないでください)、LAZY(最後は意見として解釈されるかもしれません)。 –

+4

-1 @ LukeA.Leberによるコメントの意見には、ビジョンの欠如が示されています。マジックメソッドはコードを少なくする方法ではありませんが(マジックメソッドを使用している場合)、マジックメソッドを使用すると、単純な方法では可能でないか、あまりにも複雑なので、書く価値はありません。また、PHPDocを使用すると完全にIDEに対応します。 ほとんどの場合、マジックメソッドは必要ありませんが、必要なときには(PHPでは)置き換えられません。それらを使用して非常に構造化された方法で使用される場合、完全な有効なソリューションです。 – MikeSchinkel

答えて

102

利用クラスレベルた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

詳細:

P.S. はPhpStormでうまく動作しますが(IDEにメソッドが静的であることを伝えます)、実際のphpDocumentorツールでサポートされていない可能性があります(申し訳ありませんが、しばらく使用していません)。また


:(PhpStormで、もちろん)Settings | Inspections | PHP | Undefined | Undefined method --> Downgrade severity if __magic methods are present in class - それはどのような方法で、このようなメソッドのコード補完を助けにはなりませんが、「未定義のメソッド」エラーなど、これらの魔法のメソッドをマークしません。(それはドキュメントとどのように少しの助けコード補完を扱うとき、それは実際のIDEにもたらすことのために役立つことができる方法)@property/@methodタグの正規表現/部分の名前を使用してに関する


のphpDocumentorのチケット

元の質問に多少関連
+1

ありがとう、これは合理的な提案のように見えますが、確かにphpStormでも動作しますが、各クラスの先頭に@methodの潜在的な何百もの行を書き出すのは少し嫌です。 get_by_ *メソッドは、指定されたパラメータでその型のオブジェクトを取得するために、任意のオブジェクトパラメータの前に付けることができます。 get_by _ * _ and_ *の可能性を除外しても、140種類のクラスにまたがる約1500の '@メソッド 'で終了します。ドキュメントを提供するためのより一般的な方法はありませんか? –

+0

いいえ、すべてのマジックメソッドを明示的に宣言しなければなりません。(これは、このように文書化する主なポイントです)PHPDocは部分名(例えば 'get_by _ *(int $ id)')を理解しません。 IDE(コード検査、完了ではない!)ではalt解決策(警告を無効にする)があります。 phpDocumentor(または代替ツール)のために - 私に知られている解決策はありません(おそらくそこにありますが、それについてはわかりません)。あなたはgithubへのリンクを持っています - 新しいチケットを登録し、そのような "部分的な名前"のマッチング機能を追加することを尋ねます - 彼らが何を言うかを見ます(ほとんど拒否されるでしょう)。実装されている場合は、IDEにもその機能があります。 – LazyOne

+0

https://github.com/phpDocumentor/phpDocumentor2/issues - ただし、あなたの投稿前に類似のチケットが存在しないかどうか確認してください。 – LazyOne

3

phpstormメタファイルでも定義できます。あなたは魔法が発生した場合、すべての可能性をのDocblockする必要はありません

// 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(); 

この方法:ここでファクトリメソッド(v2016.3)のための例です。

詳細はdocsあります。

+0

これは__callでは機能しません。それはまた、文書化されておらず、無効なPHPです。 PHPStormは、入力に応じて型の混合を返す静的に定義されたメソッドを持つ場所をサポートします。 – jgmjgm

関連する問題