こんにちは、Nakaです。
Laravel プロジェクトに PHPStan を導入すると、普段の開発では気づかない警告や注意点に何度も出会います。本記事では、私が実際に遭遇した PHPStan の警告について、なぜその警告が出るのか、どんな前提や意図があるのかを理解しつつ、実務上どう向き合うかを整理していきます。
本記事では、以下を有効にした Laravel プロジェクトを前提としています。
ここでは、PHPStan 導入直後に特に遭遇しやすい警告について、「なぜ怒られているのか」を中心に見ていきます。
Base::privateMethod() through static::次のように、 private メソッドを static::経由で呼び出すようなコードを書いたとします。
class Base
{
private static function privateMethod(): void
{
echo 'base';
}
public function publicMethod(): void
{
static::privateMethod();
}
}
このコードを PHPStan に通すと、次の警告が出ます。
------ -----------------------------------------------------------------------
Line test.php
------ -----------------------------------------------------------------------
14 Unsafe call to private method Base::privateMethod() through static::.
🪪 staticClassAccess.privateMethod
at test.php:14
------ -----------------------------------------------------------------------
このコードは 継承された場合に実行時エラーを引き起こす可能性があります。
class Child extends Base
{
private static function privateMethod(): void
{
echo 'child';
}
}
(new Child())->publicMethod();
static:: は遅延静的束縛により、「定義元のクラス」ではなく「実行時のクラス」を参照します。一方で、private メソッドは 定義されたクラスの中からしか呼び出せません。private メソッドは継承されないため、
Child::privateMethod()Base::privateMethod()は同名でも完全に別のメソッドとして扱われます。結果として、Base クラスのコードから Child クラスの private メソッドを呼び出そうとする形になり、次のような可視性違反による実行時エラーが発生します。