我的结构:
/test/init.php
/test/sub/Info.phpinit.php:
<?php
namespace test;
$namespaces = function($path) {
//echo $path; = test\sub\Info
if (preg_match('/\\\\/', $path)) {
$path = str_replace('\\', DIRECTORY_SEPARATOR, $path);
}
//echo $path; = test\sub\Info
if (file_exists("{$path}.php")) {
require_once("{$path}.php");
}
};
spl_autoload_register($namespaces);
$info = new sub\Info();和Info.php:
<?php
namespace test\sub;
class Info
{
public function __construct()
{
echo 123;
}
}为什么这不管用?
我使用Windows,那么为什么使用DIRECTORY_SEPARATOR == \?
编辑:对不起,我更新了我的问题。我忘了在堆栈溢出上粘贴spl_autoload_register。
发布于 2017-12-28 16:35:31
你用的是相对路径,所以有几件事可能是错误的.通过执行以下操作,可以看到哪个是当前的工作目录:
echo getcwd();你也可以尝试这样的方法:
$namespaces = function($class) {
$basepath = __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR;
$file = $basepath . str_replace('\\', DIRECTORY_SEPARATOR, $class) . ".php";
if (!file_exists($file) || !is_readable($file)) {
return false;
}
require_once($file);
return class_exists($class, false);
};变量$basepath也可以是定义的常量,也可以是配置文件中的变量.
发布于 2017-12-28 16:27:09
理想情况下,您的自动加载程序需要在名称空间之外,在目录结构的顶层定义--就目前设置它的方式而言,它试图从测试目录中而不是从根(即不存在的test/test/sub/Info.php )中包含文件test/test/sub/Info.php。
如果您从两个文件中删除名称空间前缀test (因此从init.php中完全删除它,并在sub/Info.php中只有namespace sub; ),那么它将正确工作。另一种选择是将自动加载程序移动到根目录中的文件中,以便名称空间与文件系统布局再次匹配。
https://stackoverflow.com/questions/48010522
复制相似问题