オートローダー機能で非常に奇妙な問題が発生しています。
これは、PSR-0 標準から取得したオートローダー関数です。
function __autoload($className) {
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
$lastNsPos = strrpos($className, '\\');
if ($lastNsPos) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName;
}
関数に加えた唯一の変更は、この関数を という名前のディレクトリに保持しているdirname(__FILE__)
ため、関数に を追加したことだけです。このディレクトリには、他のすべてのクラスが保持されています。このコードは私の別のプロジェクトで機能しているので、何が問題なのかよくわかりません。require
includes
includes\SQL\Persistable.php
として宣言された名前空間を持つ file:がありますnamespace SQL;
。オートローダーを実行すると、次のエラーが表示されます。
Warning: require(/home/user/public_html/phpProject/includes/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52
そのファイルが存在しないことはわかっていますが、なぜそれをロードしているのかわかりません。を要求する必要があり/home/user/public_html/phpProject/includes/SQL/Persistable.php
ます。ただし、require
関数を次のように変更すると(テストするためだけに):
require dirname(__FILE__) . DIRECTORY_SEPARATOR . ' ' . $fileName;
私は得る:
Warning: require(/home/user/public_html/phpProject/includes/ SQL/Persistable.php): failed to open stream: No such file or directory in /home/user/public_html/phpProject/includes/config.php on line 52
スペース、または実際にはスラッシュ以外の文字を追加すると、require
関数に . の最初の部分が含まれる理由がわかりません$fileName
。私も試しました:
echo dirname(__FILE__) . DIRECTORY_SEPARATOR . $fileName;
そして、その出力は次のとおりです。
/home/user/public_html/phpProject/includes/SQL/Persistable.php
ただし、require
関数では明らかにそのように解釈されません。なんで?
また__DIR__
、を介してインクルードパスを明示的に設定しset_include_path()
、関数を独自の別のファイルに入れ、それを含めてrealname()
みましたが、どれも機能しませんでした。私が言ったように、このコードは以前は機能していたので、なぜ今この問題を思いついたのかわかりません!