包含路径和php中的__autoload函数

csk*_*wrd 3 php autoload include-path

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

require_once('path/to/script.php');
Run Code Online (Sandbox Code Playgroud)

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

require_once('absolute/path/to/script.php');
Run Code Online (Sandbox Code Playgroud)

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

irc*_*ell 9

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

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

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'));
Run Code Online (Sandbox Code Playgroud)

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

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

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