is_file()确实执行stream_resolve_include_path()无法解析路径

时间:2018-07-12 10:05:49

标签: php path include-path spl-autoload-register

我目前正在使用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相同的规则,针对包含路径解析文件名。

  • 对此行为有解释吗?
  • PHP文档是否正确?
  • 使用stream_resolve_include_path()有很好的做法吗?

0 个答案:

没有答案