web-dev-qa-db-ja.com

魔法のように実装されたメソッドの「クラスにメソッドが見つかりません」という警告に対処する方法

私は、魔法のように実装されたメソッド(___call_および___callStatic_を使用)を通じて機能を公開するいくつかのクラスを含む大きなコードベースに座っています。例えば:

_class Foo {
    public function __call($name, $parameters) {
        echo "You called $name().\n";
    }
}

$f = new Foo;
$f->test();   // runs fine, but PhpStorm flags as a warning
_

問題は、PhpStormがtest()メソッドが存在しないと考えているため、呼び出しサイトで警告を出すことです。もちろん、コードは実行され、予想どおりに動作するため、これは少し面倒です。

「__magicメソッドがクラスに存在する場合、重大度をダウングレードする」オプションをチェックすることにより、重大度を既に調整しましたが、次のいずれかを選択します。

  1. 特定のクラスに対してこの機能を完全に無効にするonly、または
  2. IDEに対してではなく作業する-既に持っている情報を提供して、意見が一致するようにする

上記のいずれかは可能ですか?もしそうなら、どのように?

追加のボーナスの質問:メソッド呼び出しがチェーンされている場合を考えてください。

_$f = new Foo;
$f->test()->chain()->moreChain();   // potentially runs fine
_

$f->test()へのマジックコールが適切な何かを返すと仮定すると、後続の(おそらく、必ずしもではないが、マジックでも)コールは正常に機能します。ただし、IDE what test()が返すものを伝える方法がわからないため、残りの呼び出しチェーンに不足しているメソッドがいっぱいであるというフラグを立てます。さらに悪いことに、IDEはこれらの中間オブジェクトがどのクラスであるかを知らないため、「ダウングレードの重大度」設定はこれらの警告には適用されません。

このケースもカバーできる解決策はありますか?

更新

_@method_アノテーションを使用して魔法のメソッドを文書化することはうまくいくように見えますが、これらの関連するバグを見つけるのにほんの少しの労力しかかからなかったので、このアプローチには現在いくつかの問題があると仮定する必要があります:

彼らが合理的な時間枠でそれらを修正することを願っています。

50
Jon

まあ、設定メニューのInspectionsで、Undefined-> Undefined Methodおよび__ magicメソッドが存在する場合の重大度のダウングレードを確認します。

これにより、(警告としてではなく、情報として)フラグの重大度が低くなり、ドキュメントチェックの青信号が引き続き表示されます。

使用される可能性のあるすべてのメソッドのターゲットクラスに@propertyまたは@method PHPDoc表記があることを除けば、私が知っていることは他にありません。

enter image description here

44
Madara Uchiha

検査の重大度を下げて検査をグローバルにオフにするのではなく、特定の検査のみを無視するように1行にコメントを追加できます。

    /** @noinspection PhpUndefinedMethodInspection */
    Assertion::NullOrAssertionDoesNotExist();
31

マダラが言ったことに基づいて、どの重大度に設定しても好みに応じてダウングレードできないことがわかったので、属性のない未定義メソッドの新しい重大度を作成しましたwhatsoever、およびダウングレードチェックボックスをオフにしました(下の画像を参照)

enter image description here

魔法のメソッドにカーソルを合わせると、ポップアップメッセージが表示されますが、それ以外の場合は気が散りません。少なくともこの方法では、実際の未定義のメソッドは名前の上にマウスを移動させることで検出できるため、単に検査をオフにするよりも1つのステップが優れています。

2
daronjay

ダイナミック変数を使用できます:

$test = 'test';
$chaine = $f->$test();   // no phpStorm flag, & the code works
0
Qassoul