私は、魔法のように実装されたメソッド(___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メソッドがクラスに存在する場合、重大度をダウングレードする」オプションをチェックすることにより、重大度を既に調整しましたが、次のいずれかを選択します。
上記のいずれかは可能ですか?もしそうなら、どのように?
追加のボーナスの質問:メソッド呼び出しがチェーンされている場合を考えてください。
_$f = new Foo;
$f->test()->chain()->moreChain(); // potentially runs fine
_
$f->test()
へのマジックコールが適切な何かを返すと仮定すると、後続の(おそらく、必ずしもではないが、マジックでも)コールは正常に機能します。ただし、IDE what test()
が返すものを伝える方法がわからないため、残りの呼び出しチェーンに不足しているメソッドがいっぱいであるというフラグを立てます。さらに悪いことに、IDEはこれらの中間オブジェクトがどのクラスであるかを知らないため、「ダウングレードの重大度」設定はこれらの警告には適用されません。
このケースもカバーできる解決策はありますか?
_@method
_アノテーションを使用して魔法のメソッドを文書化することはうまくいくように見えますが、これらの関連するバグを見つけるのにほんの少しの労力しかかからなかったので、このアプローチには現在いくつかの問題があると仮定する必要があります:
彼らが合理的な時間枠でそれらを修正することを願っています。
まあ、設定メニューのInspectionsで、Undefined-> Undefined Methodおよび__ magicメソッドが存在する場合の重大度のダウングレードを確認します。
これにより、(警告としてではなく、情報として)フラグの重大度が低くなり、ドキュメントチェックの青信号が引き続き表示されます。
使用される可能性のあるすべてのメソッドのターゲットクラスに@property
または@method
PHPDoc表記があることを除けば、私が知っていることは他にありません。
検査の重大度を下げて検査をグローバルにオフにするのではなく、特定の検査のみを無視するように1行にコメントを追加できます。
/** @noinspection PhpUndefinedMethodInspection */
Assertion::NullOrAssertionDoesNotExist();
ダイナミック変数を使用できます:
$test = 'test';
$chaine = $f->$test(); // no phpStorm flag, & the code works