55

私は、魔法のように実装されたメソッド (__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. 特定のクラスに対してのみこの機能を完全に無効にする、または
  2. IDE に反対するのではなく、IDE と協力してください -- 私たちの意見が一致するように、私が既に持っている情報を IDE に提供してください

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

追加のボーナス質問: メソッド呼び出しが連鎖している場合を考えてみましょう。

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

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

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

アップデート

注釈を使用して魔法のメソッドを文書化する@methodことは機能しているように見えますが、これらの関連するバグに遭遇するのに少しの作業しかかからなかったため、現在、このアプローチにはいくつかの問題があると想定する必要があります。

彼らが妥当な時間枠でそれらを修正することを願っています.

4

4 に答える 4

46

設定メニューの[検査]に移動し、[未定義] -> [未定義のメソッド]に移動して、__magicメソッドが存在する場合はダウングレードの重大度を確認できます。

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

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

ここに画像の説明を入力してください

于 2012-09-25T12:36:49.947 に答える
39

インスペクションの重大度を下げてインスペクションをグローバルにオフにするのではなく、1 行にコメントを追加して、その特定のインスペクションだけを無視することができます。

    /** @noinspection PhpUndefinedMethodInspection */
    Assertion::NullOrAssertionDoesNotExist();
于 2016-09-29T14:27:37.223 に答える
2

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

ここに画像の説明を入力

今でも魔法のメソッドにカーソルを合わせると、ポップアップ メッセージが表示されますが、それ以外の場合は気を散らすことはありません。インスペクションを無効にするよりも 1 段階優れています。これは、少なくともこの方法では、実際の未定義のメソッドを名前にカーソルを合わせることで検出できるためです。

于 2016-02-18T10:08:47.693 に答える