spl_autoload_register()在不同的目录中

时间:2014-07-12 21:48:28

标签: php class directory-structure spl-autoload-register

我有一个自动加载每个类的文件。 这是它包含的内容:

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';
    }

2 个答案:

答案 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;
    }
})

这是我用于简单项目的另一个实现