包含路径和php中的__autoload函数

时间:2010-07-21 13:34:34

标签: php autoload include-path

我正在尝试转换几个PHP脚本以使用__autoload函数。现在我可以使用include和require这样的函数:

require_once('path/to/script.php');

但是在__autoload函数内部,我无法使用上面的行。我必须用这个:

require_once('absolute/path/to/script.php');

为什么__autoload函数似乎不使用我在php.ini中指定的包含路径?

4 个答案:

答案 0 :(得分:9)

不要使用__autoload ...它有一些缺点(包括每次执行限制自己)。如果您使用的是5.2 +,请改用spl_autoload_register

所以我通常做的是,有一个班级:

class AutoLoader {
    protected static $paths = array(
        PATH_TO_LIBRARIES,
    );
    public static function addPath($path) {
        $path = realpath($path);
        if ($path) {
            self::$paths[] = $path;
        }
    }
    public static function load($class) {
        $classPath = $class; // Do whatever logic here
        foreach (self::$paths as $path) {
            if (is_file($path . $classPath)) {
                require_once $path . $classPath;
                return;
            }
        }
    }
}
spl_autoload_register(array('AutoLoader', 'load'));

这样,如果您添加了一个库集,则可以通过调用AutoLoader::AddPath($path);将其“添加”到您的路径中。这使您的自动加载器测试变得更容易(恕我直言)。

另一个注意事项。除非绝对必要,否则不要从自动加载类中抛出异常。原因是您可以安装多个自动加载器,因此如果您不知道如何加载文件,则可能存在另一个加载文件。但是如果你抛出异常,它会跳过另一个......

就个人而言,我不喜欢使用包含相对路径。特别是对于多个包含目录(如pear),当您看到require 'foo/bar.php';时,很难确切地知道要导入哪个文件。我更喜欢在文件集define('PATH_ROOT', dirname(__FILE__));的开头定义绝对路径,然后定义该目录之外的所有其他有用路径(PATH_LIBRARIESPATH_TEMPLATES等...) 。这样,一切都是绝对定义的...而且不需要处理相对路径(就像你现在遇到的问题一样)......

答案 1 :(得分:0)

不确定没有看到整个设置。我的自动加载功能在我的全局函数文件中,如下所示:

function __autoload($class) {
    if (file_exists("includes/{$class}.php")) {
        require_once("includes/{$class}.php");
    }
    /**
     * Add any additional directories to search in within an else if statement here
     */
    else {
        // handle error gracefully
    }
}

我使用相对路径,因为脚本包含在我的index.php文件中,所有HTTP请求都通过它传递。

答案 2 :(得分:0)

我怀疑你的__autoload()函数在一个单独的文件中,然后是调用它的代码。包含文件的路径将相对于__autoload()函数声明所在的文件。

答案 3 :(得分:0)

似乎.不在您的包含路径中。所以添加使用:

set_include_path('.' . PATH_SEPARATOR . get_include_path());

现在,PHP也应该与执行的脚本目录相关。 (此处执行的脚本类似于index.php,而不是autoload.php

但为什么不使用像./path/to/class.php这样的正常相对路径?