为什么我要在include或include_one语句中使用dirname(__FILE__)


Why would I use dirname(__FILE__) in an include or include_once statement?

我看到过:

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

为什么我需要这样做为什么我要麻烦地获取目录名,然后用目录分隔符和新文件名连接?

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

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

PHP文档说,

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

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

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

现在假设bootstrap.php包含了一些用于建立数据库连接或其他类型的增强功能的代码。

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

不过有个问题。该./将相对于包含bootstrap.php而非bootstrap.php的脚本。(从技术上讲,它将相对于工作目录。)

dirname(__FILE__)允许您获得一个绝对路径(从而避免包含路径搜索),而不依赖于作为bootstrap.php所在目录的工作目录。

(注意:由于PHP 5.3,您可以使用__DIR__来代替dirname(__FILE__)。)

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

尽管一开始很奇怪,但.并不能保证在包含路径中。有时为了避免无用的stat(),当他们很少在同一目录中包含文件时,人们会将其从包含路径中删除(当你知道包含永远不会存在时,为什么要搜索当前目录?)。

注意:这个答案大约有一半是一篇相当古老的帖子中的地址:What';It’s best of require(dirname(__FILE__)'/'';myParent.php';)而不仅仅需要(';myParent.php';)?

与公认的答案相比,我可能对这个问题有更简单的解释,所以我要试一试:假设这是项目的文件和目录结构:

Project root directory:
                       file1.php
                       file3.php
                       dir1/
                            file2.php

dir1是一个目录,file2.php在里面)

这是上面三个文件的内容:

//file1.php:
<?php include "dir1/file2.php"
//file2.php:
<?php include "../file3.php"
//file3.php:
<?php echo "Hello, Test!";

现在运行file1.php并尝试猜测应该发生什么。你可能会看到"你好,测试!",但它不会显示!相反,您将得到一个错误,指示您请求的文件(file3.php)不存在!

原因是,在file1.php中,当您包含file2.php时,它的内容会被复制,然后直接粘贴回根目录中的file1.php中,因此这部分"../file3.php"从根目录运行,从而在根目录上运行一个目录(显然它找不到file3.php)。

现在,我们该怎么办

相对路径当然有上面的问题,所以我们必须使用绝对路径。然而,绝对路径也有一个问题。如果您(例如)复制根文件夹(包含整个项目)并将其粘贴到计算机上的任何其他位置,则从那时起,路径将无效!这将是一个真正的消息!

因此,我们需要绝对和动态的路径(每个文件在我们放置它的任何地方都会动态地找到它自己的绝对路径)!

我们这样做的方法是从PHP获得帮助,dirname()是要使用的函数,它提供了文件所在目录的绝对路径。使用__FILE__常量也可以轻松访问每个文件名。因此,dirname(__FILE__)可以很容易地为您提供我们在上面代码中键入的文件的绝对路径(尽管是动态的!)。现在把你的整个项目转移到一个新的地方,甚至一个新系统,塔达!它有效!

所以现在,如果我们把上面的项目转向这个:

//file1.php:
<?php include(dirname(__FILE__)."/dir1/file2.php");
//file2.php:
<?php include(dirname(__FILE__)."/../file3.php");
//file3.php:
<?php echo "Hello, Test!";

如果你运行它,你会看到全能的Hello, Test!!(希望你没有做错任何事)。

还值得一提的是,在PHP5中,PHP还提供了一种更好的方法(关于可读性和防止眼睛沸腾!),即常量__DIR__,它的作用与dirname(__FILE__)完全相同!

希望能有所帮助。

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

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

我试图做的是从根文件夹中提取一个名为/head_lib.php的文件。它不会拉任何东西来建立网页。子目录中的页眉、页脚和其他关键功能永远不会出现。直到我做到了这一点,它才像冠军一样发挥作用。

如果您希望代码在具有不同环境的多台服务器上运行,那么我们需要在include或include_one语句中使用dirname(FILE)。原因如下。1.不要给出在服务器上包含文件的绝对路径。2.像绝对路径一样动态计算全路径。

使用dirname(FILE)和随后对其自身的调用的组合,直到到达"/myfile.php"的主页。然后附加此变量,该变量包含所包含文件的路径。