为什么我要在包含或include_once语句中使用 dirname(__FILE__)?

php
2022-08-30 09:03:15

我见过这个:

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

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

上面的代码是否与此不等效:

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

??

PHP文档说,

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


答案 1

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

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

现在假设它包含一些用于设置数据库连接或其他类型的助推器的代码。bootstrap.php

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

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

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

(注意:从 PHP 5.3 开始,您可以使用 代替 .)__DIR__dirname(__FILE__)

现在,为什么不直接使用包含?'init.php';

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

注意:这个答案中大约有一半是在一篇相当古老的帖子中解决的:什么是更好的要求(dirname(__FILE__)。/'.'myParent.php') 而不是仅仅 require('myParent.php')?


答案 2

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

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.phpfile3.php

原因是,在包含 内部时,它的内容被复制,然后直接粘贴回根目录内的内容,因此此部分从根目录运行,因此在根目录中向上移动一个目录!file1.phpfile2.phpfile1.php"../file3.php"file3.php

现在,我们该怎么办?!

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

因此,我们需要既绝对又动态的路径(每个文件动态地找到自身的绝对路径,无论我们将其放置在何处)!

我们这样做的方法是从PHP获得帮助,并且是要去的函数,它给出了文件所在的目录的绝对路径。每个文件名也可以使用常量轻松访问。因此,可以很容易地为您提供我们在上述代码中键入的文件的绝对(同时动态!)路径。现在,将您的整个项目移动到一个新地方,甚至是一个新系统,tada!它的工作原理!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__)

希望有所帮助。


推荐