PHP 自动加载出错

Getting Error in PHP Autoload

我正在使用 PSR-0 进行自动加载,我知道我需要使用 PSR-4,我将在后面的部分使用它。即使是 PSR-4,也欢迎回答。

我有以下目录结构,自动加载工作正常。

+ www/entity
|__ /EntityGenerator
|       |__ /Database
|       |       |__ DatabaseConnection
|       |       |__ DatabaseConnectionInterface
|       |       |__ DatabaseRepositoryInterface
|       |       
|       |__ /Exception
|
|__ autoload.php
|__ index.php

对于下面的目录结构报错如下

警告:要求(EntityGenerator\Database\DatabaseConnection.php):无法打开流:C:\wamp\www\entity\EntityGenerator\autoload.[=32= 中没有这样的文件或目录] 第 15 行

+ www/entity
| __ /EntityGenerator
        |__ /Database
        |       |__ DatabaseConnection
        |       |__ DatabaseConnectionInterface
        |       |__ DatabaseRepositoryInterface
        |       
        |__ /Exception
        |__ autoload.php
        |__ index.php

任何人都可以解释为什么我在第二个目录结构中遇到错误。

如果有人需要完整的代码进行测试,请在下面找到link

https://github.com/channaveer/EntityGenerator

因为目录结构。您正在尝试加载 EntityGenerator\Database\DatabaseConnection。它与第一个示例中的路径匹配,但与第二个示例中的路径不匹配。看看 autoload.php 的路径。它正在寻找路径中的路径。 EntityGenerator 是 www/entity 中的有效路径,它是 autoload.php 的路径。但在第二个例子中不适用于 www/entity/EntityGenerator。

您的问题是您使用的是相对路径,它并不总是设置为当前脚本的目录。您需要使用绝对路径来确保加载您需要加载的内容。

function autoload($className)
{
    $namespaceRoot = "EntityGenerator"; 
    $className = ltrim($className, '\');
    if (strpos($className,$namespaceRoot) !== 0) { return; } //Not handling other namespaces
    $className = substr($className, strlen($namespaceRoot));
    $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 __DIR__.DIRECTORY_SEPARATOR.$fileName; //absolute path now
}
spl_autoload_register('autoload');

__DIR__ 保证 return 当前脚本所在的目录。