0

サイトを検索した後、ネームスケープを前に付けてクラスをインスタンス化するか、クラスファイルでネームスケープをコメントアウトしない限り、クラスが見つからないという致命的なエラーが発生する理由がわかりません。私はPSR-0を使用して、この問題をうまく解決しようとしています.

オートローダー コード:

    function autoload($className)
{
    $className = ltrim($className, '\\');
    $fileName  = '';
    $namespace = '';
    if ($lastNsPos = strrpos($className, '\\')) {
        $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 $fileName;
}

spl_autoload_register('autoload');

3 つのファイルすべて (Autoloader.php、Class.php、index.php) のパスは、すべて同じディレクトリ レベルにあります。サブディレクトリなどはありません。

オートローダー コードは、require_once("Autoloader.php"); を使用して index.php の先頭に実装されます。

クラスは $foo = new classFoo(); で呼び出されます。

tl;dr バージョン:

  • 呼び出されているクラスのネームスケープ宣言をコメントアウトしていますか? 正常に動作します。
  • 名前空間/クラス形式を使用してクラスをインスタンス化していますか? 正常に動作します。
  • さもないと?致命的なエラー: クラスが見つかりません (同じディレクトリにあるにもかかわらず.
4

1 に答える 1

1

グローバル名前空間にいて、クラスが他の名前空間にある場合、ファイルがrequireオートローダーまたは手動で d されたとしても、クラスを宣言するときに名前空間を使用する必要があります。これが、クラス名の衝突を防ぐための名前空間のポイントです。

名前空間のクラスがあるため、 PSR-0PSR-4が混在しているように見えますが、適切にパスされていません\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>

于 2014-03-27T20:49:11.973 に答える