こんにちは、Nakaです。

Laravel プロジェクトに PHPStan を導入すると、普段の開発では気づかない警告や注意点に何度も出会います。本記事では、私が実際に遭遇した PHPStan の警告について、なぜその警告が出るのか、どんな前提や意図があるのかを理解しつつ、実務上どう向き合うかを整理していきます。

本記事では、以下を有効にした Laravel プロジェクトを前提としています。

よく出会う PHPStan の警告と、その背景

ここでは、PHPStan 導入直後に特に遭遇しやすい警告について、「なぜ怒られているのか」を中心に見ていきます。

Unsafe call to private method 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 メソッドは継承されないため、

は同名でも完全に別のメソッドとして扱われます。結果として、Base クラスのコードから Child クラスの private メソッドを呼び出そうとする形になり、次のような可視性違反による実行時エラーが発生します。