初めに
PHPStanを使っている際、関数やメソッドに渡す引数が超過している場合にエラーを出してくれないという事象に当たりました。
備忘のためアウトプットします。
PHPStanのレベル0
まず、レベル0の説明はこちら。
basic checks, unknown classes, unknown functions, unknown methods called on
$this
, wrong number of arguments passed to those methods and functions, always undefined variables
基本的なチェック、不明なクラス、不明な関数、不明なメソッドの呼び出し$this、それらのメソッドと関数に渡される引数の数が間違っている、常に未定義の変数
メソッドに渡せれる引数の数が間違っている
とあるので、引数の数が多い場合でもエラーを出してくれるのかと思っていました。
レベル0では引数の超過を確認できない
検証のために以下のコードを作成し、解析にかけてみました。
class Level0
{
public function testAction() {
$this->knownMethod(); // 引数が足りないためエラー
$this->knownMethod("String", "test"); // 引数が超過しているがエラーにならない
}
private function knownMethod($test)
{
// do the work
}
}
実際の解析結果がこちら。
引数が足りないというエラーは出ているものの、数が多いというエラーは出ていません。
> ./bin/phpstan analyse --level 0
Note: Using configuration file C:\Path\to\workspace\phpstan.neon.
3/3 [============================] 100%
------ -----------------------------------------------------------------------------------------
Line Path/To/file/Level0.php
------ -----------------------------------------------------------------------------------------
:8 Method Path\To\file\Level0::knownMethod() invoked with 0 parameters, 1 required.
------ -----------------------------------------------------------------------------------------
[ERROR] Found 1 error
ちなみに、レベル1で実行するとちゃんとエラーになります。
> ./bin/phpstan analyse --level 1
Note: Using configuration file C:\Path\to\workspace\phpstan.neon.
3/3 [============================] 100%
------ -----------------------------------------------------------------------------------------
Line Path/To/file/Level0.php
------ -----------------------------------------------------------------------------------------
:8 Method Path\To\file\Level0::knownMethod() invoked with 0 parameters, 1 required.
:9 Method Path\To\file\Level0::knownMethod() invoked with 2 parameters, 1 required.
------ -----------------------------------------------------------------------------------------
[ERROR] Found 2 error
理由
PHPでは、引数の数が少ない場合はエラーになりますが、引数の数が多くてもエラーになることありません。
そのため、レベル0では引数の数が少ない場合のみを見ていると思われます。
終わりに
PHPStan側のバグかと思ったのですが、そもそもPHPの言語仕様のようですね。
また一つ勉強になりました。