编程语言
首页 > 编程语言> > 包含路径和php中的__autoload函数

包含路径和php中的__autoload函数

作者:互联网

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

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

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

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

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

解决方法:

不要使用__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_LIBRARIES,PATH_TEMPLATES等…).这样,一切都是绝对定义的…而且不需要处理相对路径(就像你现在遇到的问题一样)……

标签:autoload,php,include-path
来源: https://codeday.me/bug/20190723/1518273.html