PHPStorm はコードを静的解析していろいろなバグの可能性を警告してくれます。
例えば、存在しないメソッドを警告してくれる PhpUndefinedMethodInspection とかですが、マジックメソッドを多用すると警告の嵐になります。これだと PHPStorm と言うよりむしろ Warning Stormです。
<?php
class Magic
{
function __call($name, $args)
{
return $name;
}
}
$obj = new Magic();
echo $obj->ore() . PHP_EOL; // Method 'ore' not found in class Magic
echo $obj->are() . PHP_EOL; // Method 'are' not found in class Magic
クラスの docomment で @method を書いておけば大丈夫ですが、任意のメソッド名やプロパティ名を受け入れる実装もよくあるので docomment に書くことが不可能なケースもあります。
<?php
/**
* @method string ore()
* @method string are()
*/
class Magic
{
function __call($name, $args)
{
return $name;
}
}
$obj = new Magic();
echo $obj->ore() . PHP_EOL;
echo $obj->are() . PHP_EOL;
echo $obj->ure() . PHP_EOL; // Method 'ure' not found in class Magic
こんなときは @noinspection で警告を抑止できるのですが・・・
すごい多用しているとすべてに @noinspection を書くのはしんどいです。
<?php
class Magic
{
function __call($name, $args)
{
return $name;
}
}
$obj = new Magic();
/** @noinspection PhpUndefinedMethodInspection */
echo $obj->ore() . PHP_EOL;
/** @noinspection PhpUndefinedMethodInspection */
echo $obj->are() . PHP_EOL;
/** @noinspection PhpUndefinedMethodInspection */
echo $obj->ure() . PHP_EOL;
プロジェクトの設定で特定のインスペクションを無効にすることもできます(豆電球から Add method -> disable inspection を選択)。
が、それだとプロジェクト全体で無効になってしまいます。
マジックメソッドを多用しているのが一部のコードだけであれば(例えば特定のクラスでだけマジックメソッドを多用するライブラリを使っているとか)、その一部だけで無効にしたいです。
公式な方法かどうかわかりませんが、次のように波括弧で囲めばそのブロックでまとめて警告が抑止されます。
<?php
class Magic
{
function __call($name, $args)
{
return $name;
}
}
$obj = new Magic();
/** @noinspection PhpUndefinedMethodInspection */
{
echo $obj->ore() . PHP_EOL;
echo $obj->are() . PHP_EOL;
echo $obj->ure() . PHP_EOL;
}
echo $obj->pre() . PHP_EOL; // Method 'pre' not found in class Magic
クラスやメソッドの docomment に @noinspection を書いておけばそのクラスやメソッド単位で無効にできるかと思いましたがそんなことはありませんでした。