0

次のディレクトリ構造があります:
/var/www/Project1/Project1.php
/var/www/Project1/User/UserProfile.php
Project1.php 内:

<?php
namespace Project1;
set_include_path( __DIR__ );
spl_autoload_extensions('.php');
spl_autoload_register();

use User\UserProfile;

$u = new Avatar();
...

?>

UserProfile.php の内部:

<?php    
namespace Project1\User;
class Avatar{
}
...
?>

実行すると、次のようphp Project1.phpになります。

PHP 致命的なエラー: spl_autoload9(): クラス User\UserProfile を読み込めませんでした

問題がわかりません。

4

1 に答える 1

1

spl_autoload_register();params なしで呼び出すと、プロジェクト レイアウトで名前空間を処理できないデフォルトのオートローダーが登録されます。それを機能させるには、独自のメソッドを登録する必要があります。このような:

spl_autoload_register('my_autoload');

そしてオートロード機能です。この関数は、クラスが次のような方法で格納されることを期待しています。

/path/to/project/Namespace/Classname.php
/path/to/project/Namespace/Subnamespace/Classname.php

\Namespaces\Classnameのように、または古いスタイルの方法でクラスに名前を付けることができますNamespace_Classname

function my_autoload ($classname) {
    // if the class where already loaded. should not happen
    if (class_exists($classname)) {
        return true;
    }   

    // Works for PEAR style class names and namespaced class names
    $path = str_replace(
        array('_', '\\'),
        '/',
        $classname
    ) . '.php';

   if (file_exists('/path/to/project/' . $tail)) {
        include_once 'path/to/project/' . $tail;
        return true;
    }   

    return false;
}   

この関数は、私の github パッケージから取得されていることに注意してくださいJm_Autoloader。このパッケージは、複数のインクルード パス、パス プレフィックス、および静的自動読み込み (定義済みの連想配列クラス名 => ファイル名を使用) など、より多くの機能を提供します。よかったら使ってください(;_;)

于 2013-04-18T20:45:22.017 に答える