为什么我会在include或include_once语句中使用dirname(__ FILE__)?

我看过这个:

<?php include( dirname(__FILE__) . DIRECTORY_SEPARATOR . 'my_file.php'); ?> 

为什么我需要这样做? 为什么我会去麻烦获取dirname,然后连接到一个目录分隔符和一个新的文件名?

上面的代码是不是等同于这个:

 <?php include( 'my_file.php' ); ?> 

??

PHP文档说,

包含的文件基于给定的文件path,如果没有给出,则指定include_path。 如果在include_path中找不到该文件, include()将最终在调用脚本自己的目录和当前工作目录中检查失败之前。 如果include()构造找不到文件,将会发出警告; 这是与require()不同的行为,它会发出致命的错误。

假设我有一个(假的)目录结构,如:

 .../root/ /app bootstrap.php /scripts something/ somescript.php /public index.php 

现在假定bootstrap.php包含一些代码,用于设置数据库连接或其他types的增强function。

假设你想在boostrap.php文件夹中包含一个名为init.php的文件。 现在,为了避免使用include 'init.php'扫描整个包含path,可以使用include './init.php'

虽然有一个问题。 那个./将和包含bootstrap.php的脚本相关,而不是bootstrap.php 。 (从技术上讲,这将是相对于工作目录。)

dirname(__FILE__)允许您获取绝对path(从而避免包含pathsearch),而不依赖于工作目录是bootstrap.php所在的目录。

(注意:从PHP 5.3开始,可以使用__DIR__来代替dirname(__FILE__) 。)

现在,为什么不使用'init.php';

尽pipe起初很奇怪,但是. 不能保证在包含path中。 有时候为了避免无用的stat()的人把它从包含path中移除,当它们很less包含在同一个目录中的时候(为什么当你知道包含的时候search当前目录永远不会在那里?

注意:这个答案的大约一半是在一个相当老的post中的地址: 什么是更好的要求(dirname(__ FILE __)。'/'。'myParent.php')而不仅仅是要求('myParent.php')?

如果您希望代码在具有不同环境的多个服务器上运行,则需要在include或include_once语句中使用dirname( FILE )。 原因如下。 1.不要给你的服务器包含文件的绝对path。 2.像绝对path一样dynamic计算完整path。

使用dirname( FILE )和后续调用的组合,直到到达“/myfile.php”的起始位置。 然后将包含该path的variables附加到包含的文件中。

我在下面使用这个,如果这是你在想什么。 它对我来说效果很好。

 <?php include $_SERVER['DOCUMENT_ROOT']."/head_lib.php"; ?> 

我想要做的是从根文件夹中调用/ head_lib.php pulla文件。 它不会拉任何东西来build立网页。 子目录中的页眉,页脚和其他主要function将永远不会显示出来。 直到我做了上面,它像一个冠军。