0
0

【覚書き】PHPStanのレベル0では、関数に渡す引数の不足は確認するが超過は確認できない

Posted at

初めに

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の言語仕様のようですね。
また一つ勉強になりました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0