require(dirname(__FILE__).'/'.'myParent.php') 比 require('myParent.php') 有啥好处?

Posted

技术标签:

【中文标题】require(dirname(__FILE__).\'/\'.\'myParent.php\') 比 require(\'myParent.php\') 有啥好处?【英文标题】:What's better of require(dirname(__FILE__).'/'.'myParent.php') than just require('myParent.php')?require(dirname(__FILE__).'/'.'myParent.php') 比 require('myParent.php') 有什么好处? 【发布时间】:2011-01-14 07:04:27 【问题描述】:

包括 WordPress 在内的许多著名 php 脚本在包含当前运行脚本的同一目录中的文件时使用 dirname(__FILE__).'/myParent.php' 而不仅仅是 'myParent.php'

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

谢谢。

【问题讨论】:

请注意,您应该始终首选__DIR__ 来替代dirname(__FILE__) __DIR__ 从 PHP 5.3 开始支持 【参考方案1】:

关于 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_path 慢(除非你的 include_path 中有很多路径)。

【讨论】:

__DIR__(这样可以节省dirname()的调用) 是的,但__DIR__ 仅在 PHP 5.3.0 之后可用,而 __FILE__dirname() 从 PHP 4.0.2 起都可用。 __DIR__ 调用效率更高,但兼容性较差:/【参考方案2】:

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

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

结果

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

(8.3664200305939 - 8.3511519432068) / 100000 = 0.000000152680874s

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

测试代码

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\"):  $_ts\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 第 7 版)上进行的

【讨论】:

以下是我的测试结果,包括更多方法:100.0% - include(__DIR__ . "/include.php"): 3.1468150615692s118.1% - include("./include.php"): 3.7181701660156s154.6% - include("include.php"): 4.8651170730591s162.8% - include(dirname(__FILE__) . "/include.php"): 5.1241970062256s【参考方案3】:

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

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

【讨论】:

不需要绝对路径,也不一定需要包含路径。 “如果定义了路径(完整或相对),则 include_path 将被完全忽略。” us2.php.net/manual/en/function.include.php @Justin Johnson:使用 path 手册可能意味着该字符串至少包含一个 /。所以./foofoo/bar/foo/bar 是路径,但foo 不是。这也适用于myParent.php 这个require dirname(dirname(dirname(__FILE__)))."/out/DBconnection.php"; 有什么替代方案吗?我想要./../../ 之类的东西。有吗?【参考方案4】:

使用 dirname + 文件名稍微快一些,因为 PHP 不会遍历 include_path 来搜索文件。如果速度很重要,您可能会输入更多内容。

【讨论】:

以上是关于require(dirname(__FILE__).'/'.'myParent.php') 比 require('myParent.php') 有啥好处?的主要内容,如果未能解决你的问题,请参考以下文章

****php:require_once(dirname(__FILE__)."/./config_uc.php");

php语言:require_once(dirname(__FILE__)."/./config_uc.php");讲解

yii2 中excel表导出

phpexce 表格上传与下载

电子傀儡师出错。 “require 未定义”和“__dirname 未定义”

?dirname(__FILE__)