我读了SO并尝试了一些答案,但是我的代码不起作用:
我有两节课:C:\Apache24\htdocs\phpdb\classes\dbconnection\mysqlconnection\MySqlConnection.php
和C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php
。
在CreateTableDemo中,我有以下代码:
namespace utilities\mysqlutilities;
use dbconnection\mysqlconnection\MySqlConnection as MSC;
spl_autoload_register(function($class){
$class = 'classes\\'.$class.'.php';
require_once "$class";
});
我收到以下警告:
`Warning: require_once(classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.
我理解警告,该脚本在同一文件夹中找不到命名空间类,因此我更改了spl_autoload_register
来寻找相对路径:__DIR__."\\..\\..\\classes\\.$class.'.php'
。我得到
warning: `Warning: require_once(C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\..\..\classes\dbconnection\mysqlconnection\MySqlConnection.php): failed to open stream: No such file or directory in C:\Apache24\htdocs\phpdb\classes\utilities\mysqlutilities\CreateTableDemo.php on line 10`.
我找不到将脚本定向到命名空间类的方法。 预先感谢您的帮助。
答案 0 :(得分:0)
在单独的文件中创建自动装带器类:
class Autoloader {
static public function loader($path) {
$filename = __DIR__.'/classes/'.str_replace("\\", '/', $path).".php";
if (file_exists($filename)) {
include($filename);
$aClass = explode('\\', $path);
$className = array_pop($aClass);
if (class_exists($className)) {
return TRUE;
}
}
return FALSE;
}
}
spl_autoload_register('Autoloader::loader');
并将其包括在索引文件(或其他文件)中。 它将加载位于文件夹“ classes”中的所有命名空间类。
require_once '/PATH_TO/autoload.php';
顺便说一句:诀窍是将反斜杠替换为常规斜杠。 对我来说很好。
编辑:将autoloader.php放置在与“ classes”文件夹相同的级别。 :-)
答案 1 :(得分:0)
之所以失败,是因为相对于您所需要的来源,类的路径是错误的。试试:
namespace utilities\mysqlutilities;
use dbconnection\mysqlconnection\MySqlConnection as MSC;
spl_autoload_register(function($class){
$exp = explode('classes', __DIR__);
$base = reset($exp);
$class = $base."classes".DIRECTORY_SEPARATOR.$class.".php";
require_once $class;
});