Aikido

PHP のオートロードエラーを修正する方法: クラス名とファイル名のマッチング

バグのリスク

ルール
クラス 名前 必須 ファイル名 ファイル名と一致する必要があります。
多くの 言語  クラス の名前
 マッチする ファイル名 に正確に一致させる、 あるいは でなければ
失敗する 大文字と小文字を区別する 大文字小文字を区別する ファイルシステム (Linux)。

サポートされている言語 PHP

はじめに

PHP の PSR-4 オートロードでは、クラス名は大文字小文字を含めてファイル名と正確に一致する必要があります。クラス名が ユーザーリポジトリ でなければならない。 ユーザーリポジトリ.phpではない。 ユーザーリポジトリ.php.これは、WindowsやmacOSのような大文字小文字を区別しないファイルシステム上では動作するが、Linuxサーバー上では動作せず、本番環境で "Class not found "エラーを引き起こす。

なぜそれが重要なのか

本番環境での失敗:ファイルシステムの大文字と小文字が区別されるLinuxサーバーで、名前の不一致がオートロードの失敗を引き起こす。ローカルで動作しているコードが本番で動作しなくなり、緊急のホットフィックスが必要になったり、ダウンタイムが発生したりします。

PSR-4 準拠:最近の PHP フレームワークは PSR-4 オートロードに依存しています。命名規約に従わないクラスはオートロードできず、 依存性注入やサービスコンテナ、フレームワークの機能を壊してしまいます。

コード例

非準拠:

<?php
// File: userrepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

なぜそれが間違っているのか: クラス名は ユーザーリポジトリ しかし、ファイル名は ユーザーリポジトリ.php (小文字)。PSR-4オートローダーは以下を検索します。 ユーザーリポジトリ.php 大文字と小文字を区別するLinuxのファイルシステム上では、それを見つけることができず、本番で致命的なエラーを引き起こす。

✅ 準拠:

<?php
// File: UserRepository.php

namespace App\Repositories;

class UserRepository
{
    public function findById($id)
    {
        return User::find($id);
    }

    public function save(User $user)
    {
        return $user->save();
    }
}

なぜこれが重要なのか: ファイル名 ユーザーリポジトリ.php はクラス名に一致する。 ユーザーリポジトリ をケースを含めて正確に指定します。PSR-4オートローダーは、どのようなファイルシステム上でも確実にクラスを見つけ、ロードすることができるため、環境固有の不具合を排除し、開発から生産まで一貫した動作を保証します。

結論

プロジェクトの開始時から、ファイル名とクラス名の厳格なマッチングを強制します。クラスを作成する際に、自動的に正しいファイル名を付けるようにIDEを設定する。CI/CDパイプラインで自動チェックを使用して、デプロイ前にミスマッチを検出する。適切な命名に5分費やすだけで、本番環境でのオートロードの失敗を何時間もデバッグする必要がなくなります。

よくある質問

ご質問は?

Windows/macOSでは動作するのに、なぜLinuxでは失敗するのですか?

Windows および macOS は、デフォルトで大文字小文字を区別しないファイルシステム (NTFS, APFS, HFS+) を使用しています。PHPのオートローダがUserRepository.phpをリクエストすると、 これらのシステムではファイル名の大文字小文字が区別されないため userrepository.phpが返されます。Linuxでは大文字小文字を区別するファイルシステム(ext4, xfs)を使用しており、 UserRepository.phpとuserrepository.phpは全く別のファイルです。オートローダーは完全一致を探すため、失敗します。

コードベース内のすべてのクラス/ファイル名のミスマッチを見つけるには?

PHP ファイルをスキャンし、リフレクションや正規表現を使ってクラス名を抽出し、 ファイル名と比較するスクリプトを書きます。多くの静的解析ツールは、PSR-4違反を検出します。CI/CD では、Composer のオートローダの検証を composer dump-autoload --optimize --strict-psr で実行します。これにより、デプロイ前にミスマッチが検出される。PhpStormのようないくつかのIDEは、開発中にPSR-4違反をハイライトする。

トレイト、インターフェイス、抽象クラスについてはどうですか?

同じルールが適用されます。UserRepositoryInterfaceという名前のインターフェースは、UserRepositoryInterface.phpになければなりません。Timestampableという名前のtraitはTimestampable.phpが必要です。抽象クラスも同じパターンに従います。PSR-4は、すべてのクラスのような構造を同じように扱います。ファイル名は、大文字と小文字を含めて、クラス名/特性名/インターフェース名と正確に一致しなければなりません。

ファイル名にアンダースコアやハイフンは使えますか?

PSR-4 準拠のため不可。PHP のクラス名には、ハイフンやほとんどの特殊文字を含めることはできません。アンダースコアは技術的にはクラス名に使用できますが、 PSR 標準では推奨されていません。クラス名とファイル名の両方で PascalCase を使用します:User_Repository や user-repository ではなく、UserRepository を使用してください。User_Repository や user-repository ではなく、UserRepository としてください。

1つのファイルに複数のクラスがある場合は?

そうではありません。PSR-4では、1つのファイルに1つのクラスが必要です。オートローダは、クラス名とファイルパスの間に1:1の関係を期待しているので、1つのファイルに複数のクラスがあると、オートロードが壊れてしまいます。緊密に結合されたクラスがある場合、それらを内部クラスにするか、別々のファイルにするか、あるいは1つのまとまったクラスにリファクタリングするかを検討してください。1つのファイルに1つのクラスは、PSR-4の基本的な要件です。

このルールに違反するレガシーコードをどう扱えばいいのか?

Linux サーバーにデプロイする前に、すべてのミスマッチを修正してください。クラス名とファイル名を同時に変更できる IDE リファクタリングツールを使いましょう。macOS では、大文字と小文字のみのリネームでは 2 回の git コミットが必要になることがあります。最初に一時的な名前(UserRepository_temp.php)にリネームしてからコミットし、次に正しい大文字と小文字(UserRepository.php)にリネームします。大規模なコードベースの場合は、専用のPRですべての違反を修正し、徹底的にテストしてからデプロイしてください。ファイル名を変更した後、Composerのオートローダー(composer dump-autoload)を更新する。

名前空間はファイル名に影響しますか?

名前空間は、ファイル名そのものではなく、ディレクトリ構造に影響します。App/Repositories/UserRepositoryクラスはapp/Repositories/UserRepository.php(PSR-4のルートによってはsrc/Repositories/UserRepository.php)にあるべきです。名前空間はディレクトリに対応し、クラス名はファイル名に対応します。名前空間セグメントは大文字と小文字が一致するディレクトリにマップされ、クラス名は大文字と小文字が一致するファイル名にマップされます。

まずは無料で体験

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。