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
因为目录结构。您正在尝试加载 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 当前脚本所在的目录。
我正在使用 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
因为目录结构。您正在尝试加载 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 当前脚本所在的目录。