最も一般的な問題の1つは、 SPL_AUTOLOAD_REGISTERが正しく呼ばれていないか、他の場所に上書きされないことです。たとえば、複数のオートローダーが注文エラーで登録されている場合、一部のクラスは見つかりません。
<?php
spl_autoload_register(function ($class) {
include __DIR__ . '/classes/' . $class . '.php';
});
この匿名関数が登録および実行されていることを確認してください。 SPL_AUTOLOAD_FUNCTIONS()を介して、現在登録されているAutolOAD関数のリストを確認できます。
名前空間を使用する場合、クラス名にはバックスラッシュ(\)が含まれています。バックスラッシュは、ファイルパス解像度で正しく交換されないため、ファイルが見つかります。
<?php
spl_autoload_register(function ($class) {
$path = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
require $path;
});
注: str_replace( '\\'、 '/'、$ class)を使用して、名前空間をディレクトリパスに変換する必要があります。
Linuxなどの在来のファイルシステムでは、クラス名の場合はファイル名と正確に一致する必要があります。 Windows(case-sensensitive)の下で開発し、Linuxに展開すると、エラーが見つからないクラスが発生する場合があります。
PSR-4ネーミング仕様を均一に使用し、そのような問題を回避するためにComposer Automaticロードを使用することをお勧めします。
別の一般的な理由は、パスエラーまたはルートディレクトリエラーです。たとえば、プロジェクト構造が変更された後、次のパススプライシング方法が失敗する可能性があります。
require 'classes/' . $class . '.php';
より堅牢な方法は、絶対パスを使用することです。
require __DIR__ . '/classes/' . $class . '.php';
または、 RealPath()を使用して、パスが存在するかどうかを確認します。
自動負荷ロジックが正しい場合でも、ターゲットクラスファイル自体が存在しないか、正しく作成されていない場合、自動ローダーは自然にクラスをロードできません。現時点では、同様の方法でデバッグすることは非常に役立ちます。
<?php
spl_autoload_register(function ($class) {
$file = __DIR__ . '/classes/' . $class . '.php';
if (!file_exists($file)) {
error_log("Autoload failed: $file not found");
}
require $file;
});
Composer(推奨方法)を介して自動負荷を管理している場合は、次のことを確認する必要があります。
Composer Dump-Autoloadが実行され、ベンダー/autoload.phpが最新であることを確認しています。
「ベンダー/autoload.php」が必要です。正しく呼ばれ、パスは正しいです。
<?php
require __DIR__ . '/vendor/autoload.php';
プロジェクトのhttps://gitbox.net/vendor/autoload.phpにアクセスして、ファイルが正しく展開されているかどうかを確認できます。