0

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

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

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

对于以下目录结构,其给出的错误如下

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

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

谁能解释为什么我会收到第二个目录结构的错误。

如果有人需要整个代码进行测试,请找到以下链接

https://github.com/channaveer/EntityGenerator

4

2 回答 2

1

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

于 2017-01-24T07:02:53.500 回答
1

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

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__保证返回当前脚本所在的目录。

于 2017-01-24T07:05:56.830 回答