例如,我总是看到这样调用的自动加载器:
require_once __DIR__ . '/../vendor/autoload.php';
这和更简洁的有什么区别
require_once '../vendor/autoload.php';
?
PHP 脚本相对于当前路径运行(
getcwd()
的结果),而不是相对于它们自己的文件的路径。使用 __DIR__
强制包含相对于它们自己的路径发生。
为了进行演示,请创建以下文件(和目录):
- file1.php
- dir/
- file2.php
- file3.php
如果
file2.php
包含 file3.php
,如下所示:
include `file3.php`.
直接拨打
file2.php
就可以了。但是,如果 file1.php
包含 file2.php
,则当前目录 (getcwd()
) 对于 file2.php
来说是错误的,因此无法包含 file3.php
。
当前接受的答案并没有完全解释使用
__DIR__
的原因,在我看来答案是错误的。
我将解释为什么我们真的需要这个。
假设我们有这样的文件结构
- index.php
- file3.php -(content: hello fake world)
- dir/
- file2.php
- file3.php - (content: hello world)
如果我们从
file3.php
中包含 file2.php
并直接运行 file2.php
,我们将看到输出 hello world
。
现在,当我们在 file2.php
中包含 index.php
时,当代码开始执行时,它会再次看到 file2.php
,使用 file3.php
包含 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'
中使用 file2.php
,那么即使父目录中存在另一个 file3.php
,它也会包含正确的文件。
对于包含,可以设置 PHP 自动搜索的一些文件夹。当您包含具有相对路径的文件时,您将在所有该文件夹中进行搜索。最好定义真实路径,防止加载错误文件时出现一些错误。
https://secure.php.net/manual/en/function.set-include-path.php
然后您就可以确定加载了正确的文件。
例如,当文件位于 C:/xampp/htdocs/projecName/originalDirectory 中时,../ 路径从写入文件的父目录开始,在本例中为 originalDirectory .
但是,如果该文件包含在原始目录之外的其他位置,则父目录不再相同,因此路径将失败。
结论:使用 ../ 是不可移植的,因为它是相对于当前目录的。
这就是我们使用
__DIR__
作为前缀的原因。
__DIR__
将“硬连线”绝对路径,在本例中为 C:/xampp/htdocs/projecName/originalDirectory。
因此,无论从哪里调用文件,它总是从 originalDirectory 开始,因为它已经被设定为如下:
C:/xampp/htdocs/projecName/originalDirectory/../filebeingincluded.php .