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.1468150615692s
118.1% - include("./include.php"): 3.7181701660156s
154.6% - include("include.php"): 4.8651170730591s
162.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 手册可能意味着该字符串至少包含一个/
。所以./foo
、foo/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");讲解