PHP以CLI运行时require的有趣问题
假设当前工作目录是/home/james/, 子目录与文件的结构如下:
bin/php/run.php的代码如下:
require_once 'pub.php'; echo pub_info() . "\n";
pub.php的代码如下:
function pub_info() { return 'Public function v 1'; }
bin/php/pub.php的代码如下:
function pub_info() { return 'Public function v 2'; }
两个pub.php都定义了同一个函数,现在运行:
php bin/php/run.php
输入是将是: Public function v 1,说明require_once加载的是最外面的pub.php。
如果将最外面的pub.php删除,再运行php bin/php/run.php,则会输出: Public function v 2。
现在将bin/php/run.php的内容改为:
require_once './pub.php'; echo pub_info() . "\n";
注意到只是在require_once中加了”./”, 现在如果删除最外层的pub.php将出到Fatal Error, 因为无法找到”./pub.php”。
总结
以CLI运行时,require/require_once/include/include_once的是相对路径,但没有加”./”,刚优先查找当前工作目录,然后是被运行脚本所在目录。但是如果相对路径前面加了”./”,则只会查找当前工作目录。