我有一个自动加载每个类的文件。 这是它包含的内容:
spl_autoload_register(function($class){
require_once 'classes/' . $class . '.php';
});
require_once 'functions/sanitize.php';
require_once 'functions/hash.php';
但当我require_once
这个文件来自我的 ajax 文件夹中的另一个php文件时,它会尝试寻找类,该函数会看起来来自我的课程,其路径为:main_folder/ajax/classes
,而不仅仅是main_folder/classes
。
有谁知道如何解决这个问题?
FIX :
spl_autoload_register(function($class){
if (file_exists('classes/' . $class . '.php')) {
require_once 'classes/' . $class . '.php';
}
elseif (file_exists('../classes/' . $class . '.php')) {
require_once '../classes/' . $class . '.php';
}
elseif (file_exists('../../classes/' . $class . '.php')) {
require_once '../../classes/' . $class . '.php';
}
答案 0 :(得分:1)
你应该只使用这个函数一次 - 在主文件中(通常是index.php)而不是在另一个文件中。
但是,如果不可能(但我没有看到任何可能的原因)你可以改变它,例如:
spl_autoload_register(function($class){
if (file_exists('classes/' . $class . '.php')) {
require_once 'classes/' . $class . '.php';
}
elseif (file_exists( $class . '.php')) {
require_once $class . '.php';
}
});
答案 1 :(得分:0)
您需要知道classes目录的绝对路径,然后使用完整的限定路径来实现目标。
确保使用http服务器正确配置了文档根目录。此外,这通常通过将所有请求路由到index.php并从那里派生基本路径(文档根)来解决。以下是您修改的代码:
spl_autoload_register(function($class) {
$resolved = $_SERVER['DOCUMENT_ROOT'] . DIRECTORY_SEPARATOR . 'classes' . DIRECTORY_SEPARATOR . $class . '.php';
if(file_exists($resolved)) {
require_once $resolved;
} else {
// make it known to your that a class failed to load somehow
return;
}
})
这是我用于简单项目的另一个实现