为什么在 require_once 中包含 __DIR__ ?

问题描述 投票:0回答:4

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

require_once __DIR__ . '/../vendor/autoload.php';

这和更简洁的有什么区别

require_once '../vendor/autoload.php';

php autoloader
4个回答
39
投票

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


11
投票

当前接受的答案并没有完全解释使用

__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
,它也会包含正确的文件。


0
投票

对于包含,可以设置 PHP 自动搜索的一些文件夹。当您包含具有相对路径的文件时,您将在所有该文件夹中进行搜索。最好定义真实路径,防止加载错误文件时出现一些错误。

https://secure.php.net/manual/en/function.set-include-path.php

然后您就可以确定加载了正确的文件。


0
投票

例如,当文件位于 C:/xampp/htdocs/projecName/originalDirectory 中时,../ 路径从写入文件的父目录开始,在本例中为 originalDirectory .

但是,如果该文件包含在原始目录之外的其他位置,则父目录不再相同,因此路径将失败。

结论:使用 ../ 是不可移植的,因为它是相对于当前目录的。

这就是我们使用

__DIR__
作为前缀的原因。
__DIR__
将“硬连线”绝对路径,在本例中为 C:/xampp/htdocs/projecName/originalDirectory

因此,无论从哪里调用文件,它总是从 originalDirectory 开始,因为它已经被设定为如下:

C:/xampp/htdocs/projecName/originalDirectory/../filebeingincluded.php .

© www.soinside.com 2019 - 2024. All rights reserved.