什么是更好的require(dirname(__ FILE __)。'/'。'myParent.php')而不仅仅是require('myParent.php')?

时间:2010-02-08 08:59:56

标签: php include require

当将文件包含在当前运行的脚本的同一目录中时,很多着名的PHP脚本(包括WordPress)都使用dirname(__FILE__).'/myParent.php'而不是'myParent.php'

他们不是一回事吗?为什么你更喜欢打字?

感谢。

4 个答案:

答案 0 :(得分:16)

PHP需要知道文件的绝对路径。 dirname(__FILE__).'/myParent.php'已经是绝对路径,但'myParent.php'需要使用include_path中的给定路径进行查找以获取绝对路径并找到该文件。更好的选择是'./myParent.php'

  

但是,显式使用include './file'比让PHP始终检查每个包含的当前目录更有效。

答案 1 :(得分:14)

除了性能提升(在大多数情况下可能是预优化*)之外,它还可以防止环境的PHP配置没有当前目录(.)的(非常奇怪的)情况包含路径的一部分。

* include的基准使用需要include_path查找的路径而不是相对路径。每次测试超过100000次迭代

结果

include("include.php"):   8.3664200305939s
include("./include.php"): 8.3511519432068s

(8.3664200305939 - 8.3511519432068) / 100000 = 0.000000152680874s

除非您包含数百或数千个文件,否则0.0000001s最多可以忽略不计。

测试代码

define("MAX", 100000);

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

echo "include(\"include.php\"):  {$_t}s\n";

ob_start();
$i = MAX;
$_t = microtime(true);
do {
    include("./include.php");
} while ( --$i );
$_t = microtime(true) - $_t;
ob_end_clean();

测试在2.16GHz Macbook 10.5.8上进行,PHP版本为5.2.9(www.entropy.ch Release 7)

答案 2 :(得分:11)

使用dirname +文件名稍快一些,因为PHP不会通过 include_path 搜索该文件。如果速度很重要,您可能会输入更多。

答案 3 :(得分:7)

关于include('。/ file.php')的补充说明。

如果只有速度很重要,那么你可以使用include('。/ file.php'),但是如果你想解决依赖关系和相对路径问题,你最好使用dirname(__ FILE __),因为

include('./file.php')

仍将构建相对于执行脚本的路径(包括脚本),而

include(dirname(__FILE__).'/file.php');

将解析相对于此行所在的当前脚本的路径(包含脚本)。

通常情况下,你最好使用dirname(__ FILE __),因为'./'只能提供可忽略的性能提升,而dirname(__ FILE __)可以为你提供更可靠的包含。

/编辑:另请注意,上面执行的基准测试仅涉及include('./something.php'),这确实比include('something.php')更快,因为您没有include_path行走,但是当您使用dirname(__FILE__)时你得到dirname()函数调用开销,这比走include include_path慢(除非你的include_path中有很多路径)。