2

オートローダー機能で非常に奇妙な問題が発生しています。

これは、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__)ため、関数に を追加したことだけです。このディレクトリには、他のすべてのクラスが保持されています。このコードは私の別のプロジェクトで機能しているので、何が問題なのかよくわかりません。requireincludes

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()みましたが、どれも機能しませんでした。私が言ったように、このコードは以前は機能していたので、なぜ今この問題を思いついたのかわかりません!

4

1 に答える 1

0

問題のあるステートメントは、準備されたステートメントの結果のフェッチでした。

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, 'Persistable');

次のように変更します。

$stmt->setFetchMode(\PDO::FETCH_CLASS | \PDO::FETCH_PROPS_LATE, '\SQL\Persistable');

問題の解決に役立ちました...しかし、現在、別の質問にあるPDOの問題に直面しています。

于 2013-01-15T15:19:07.850 に答える