包含路径和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