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中指定的包含路径?
不要使用__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
等...).这样,一切都是绝对定义的...而且不需要处理相对路径(就像你现在遇到的问题一样)......
归档时间: |
|
查看次数: |
10046 次 |
最近记录: |