我目前正在使用stream_resolve_include_path()
之前的include
在PHP中进行自动加载。它在子目录中可以正常工作,但在项目的根目录中却不能。
'php/myClass.php'
失败'../php/myClass.php'
起作用(在子目录中)我实际上是用is_file()
修复的,但是我不理解这种行为。
代码:
在脚本中,我首先获得用于构建路径的“前缀” 的父目录的数量:'../../'
// the "root directory" in localhost
const ROOT_PATH = '/localhost_path';
$rel_path = explode('/', str_replace(ROOT_PATH, '', $_SERVER['SCRIPT_NAME']));
$rel_path = array_filter($rel_path);
if (strpos(end($rel_path), '.php') !== false) {
array_pop($rel_path);
}
$prefix = implode('/', array_fill(0, count($rel_path), '..'));
$prefix = empty($prefix) ? '' : $prefix . '/';
然后使用自动加载功能加载Trait或Class:
spl_autoload_register(function ($name) {
global $prefix;
$resource = str_replace('\\', '/', $name);
$trait = $prefix . 'php/' . $resource . '.trait.php';
$class = $prefix . 'php/' . $resource . '.class.php';
if (stream_resolve_include_path($trait)) {
include $trait;
} elseif (stream_resolve_include_path($class)) {
include $class;
} else { // This is actually for debugging
die($trait . '<br>' . $class . '<br>' . $name);
}
});
问题和解决方法:
生成的路径字符串与自动加载器之前的相同,我实际上使用is_file()
修复了该问题:
if (stream_resolve_include_path($trait) || is_file($trait)) { ...
stream_resolve_include_path()
失败,即使include
可以正常工作(经过测试),并且文档说:
说明:根据与fopen()/ include相同的规则,针对包含路径解析文件名。
stream_resolve_include_path()
有很好的做法吗?