🐶

PHPStanで引数の型チェック

2023/09/27に公開

PHPStanには検査のレベルがあり、徐々に厳しくすることで未成熟なコードでも無理なく導入できるようになっている。

https://phpstan.org/user-guide/rule-levels

level5の概要を見ると以下のように書かれている。

  1. checking types of arguments passed to methods and functions

これがどのように実現されているのか、コードとドキュメントを追ってみた。 バージョンは以下の通り。

$ ./vendor/bin/phpstan -V    
PHPStan - PHP Static Analysis Tool 1.10.25

level5で解析を実行するには./vendor/bin/phpstan analyze --level 5 srcのようにする。 この時CommandHelperにおいてvendor/phpstan/phpstan/phpstan.phar/conf/config.level5.neonを読み込みにいくので、これを確認してみる。

parameters:
	checkFunctionArgumentTypes: true

rulesではなくparametersが設定されているようだ。このあたりを参考にcheckFunctionArgumentTypesを受け取るargumentsを探しにゆきconfig.neonが見つかった。

services:
    # 略
    -
        class: PHPStan\Rules\FunctionCallParametersCheck
        arguments:
            checkArgumentTypes: %checkFunctionArgumentTypes%
            checkArgumentsPassedByReference: %checkArgumentsPassedByReference%
            checkExtraArguments: %checkExtraArguments%
            checkMissingTypehints: %checkMissingTypehints%
            checkUnresolvableParameterTypes: %featureToggles.checkUnresolvableParameterTypes%

引数を与えることでFunctionCallParametersCheckの挙動を制御できるようだ。FunctionCallParametersCheckの中身を確認してみる。FunctionCallParametersCheck->check()にルールが書かれている。そして、これを呼び出すCallToFunctionParametersRuleCallMethodsRuleconfig.level0.neonで実行されるように設定されている。

というわけでFunctionCallParametersCheckに含まれる一部のルールはlevelによらず実行されるが、functionの引数の型をチェックするのはlevel5からとわかった。

Discussion