为什么在require_once中包含__DIR__?

Dan*_*eed 18 php autoloader

例如,我总是看到这样的自动加载器:

require_once __DIR__ . '/../vendor/autoload.php';
Run Code Online (Sandbox Code Playgroud)

有什么区别和更简洁

require_once '../vendor/autoload.php';
Run Code Online (Sandbox Code Playgroud)

Eve*_*ert 26

PHP脚本相对于当前路径(结果getcwd())运行,而不是相对于自己文件的路径.使用__DIR__强制包括相对于自己的路径发生.

要演示,请创建以下文件(和目录):

- file1.php
- dir/
   - file2.php
   - file3.php
Run Code Online (Sandbox Code Playgroud)

如果file2.php包含file3.php这样的:

include `file3.php`.
Run Code Online (Sandbox Code Playgroud)

如果你file2.php直接打电话,它会正常工作.但是,如果file1.php 包含 file2.php当前目录(getcwd()),则会出错file2.php,因此file3.php无法包含.


小智 14

目前接受的答案并没有完全解释使用的原因__DIR__,在我看来,答案是错误的。我将解释为什么我们真的需要这个。假设我们有这样的文件结构

- index.php
- file3.php -(content: hello fake world)
- dir/
   - file2.php
   - file3.php - (content: hello world)
Run Code Online (Sandbox Code Playgroud)

如果我们包含file3.phpfromfile2.php并直接运行file2.php,我们将看到输出hello world。现在,当我们包含file2.phpin时index.php,当代码开始执行时,它将file2.php再次看到包括file3.phpusing include 'file3.php',首先执行将在当前执行目录中查找file3.php(与存在的目录相同index.php)。因为file3.php存在于该目录中,它将包含 ,file3.php而不是dir/file3.php,我们将看到输出hello fake world而不是hello world

如果file3.php不存在于同一目录中,则它将包含正确的dir/file3.php文件,这使得接受的答案无效,因为它指出file3.php cannot be included这不是真的。它包含在内。

然而,使用的必要性就来了__DIR__。如果我们使用include __DIR__ . '/file3.php'in file2.php,那么即使file3.php父目录中存在另一个文件,它也会包含正确的文件。