我在理解PHP相对包含路径的规则时遇到了麻烦。如果我运行文件A.PHP-并且文件A. PHP包含文件B. PHP,而文件B. PHP包含文件C. PHP,那么C. PHP的相对路径应该与B. PHP的位置相关,还是与A.PHP的位置相关?也就是说,从哪个 * 文件 * 调用include重要吗?还是只关注当前工作目录是什么-以及是什么决定了当前工作目录?
ff29svar1#
它是相对于主脚本的,在本例中是A.php。请记住,include()只是将代码插入到当前运行的脚本中。也就是说,从哪个文件调用include有关系吗号如果你想让它变得重要,并且相对于B.php做一个包含,使用__FILE__常量(或自PHP 5.2 IIRC起的__DIR__),它将始终指向代码行所在的文本当前文件。
include()
__FILE__
__DIR__
include(dirname(__FILE__)."/C.PHP");
6pp0gazn2#
@Pekka让我在那里,但只是想分享我学到的:getcwd()返回您开始执行的文件所在的目录。dirname(__FILE__)返回包含当前执行代码的文件的目录。使用这两个函数,您总是可以构建一个相对于您需要的包含路径。例如,如果b.php和c.php共享一个目录,b.php可以包含c.php,如:
getcwd()
dirname(__FILE__)
include(dirname(__FILE__).'/c.php');
无论从何处调用b.php。事实上,这是建立相对路径的首选方式,因为额外的代码使PHP不必在尝试定位目标文件时遍历include_path。资料来源:Difference Between getcwd() and dirname(FILE) ? Which should I use?Why you should use dirname(FILE)
f3temu5u3#
公认的Pekka的答案是不完整的,在一般情况下,误导。如果文件是作为相对路径提供的,则被调用的语言结构include将按以下方式搜索它。首先,它将遍历环境变量include_path的路径,可以使用ini_set进行设置。如果失败,它将在调用脚本自己的目录dirname(__FILE__)(__DIR__与php >= 5.3)中搜索。如果这也失败,只有这样,它才会在工作目录中搜索!默认情况下,环境变量include_path以.开头,这是当前的工作目录。这是它首先在当前工作目录中搜索的唯一原因。请参见http://php.net/manual/en/function.include.php。根据给定的文件路径包含文件,如果未指定,则根据指定的include_path包含文件。如果在include_path中找不到文件,include将在失败之前最终签入调用脚本的自己目录和当前工作目录。因此,问题第一部分的正确答案是,包含的调用脚本位于何处确实重要。问题最后一部分的答案是,在Web服务器上下文中,初始工作目录是被调用脚本的目录,该脚本包括PHP处理的所有其他脚本。在命令行上下文中,初始工作目录是php在提示符下被调用时的任何目录,而不一定是被调用脚本所在的目录。但是,当前工作目录可以在运行时使用PHP函数chdir进行更改。参见http://php.net/manual/en/function.chdir.php。添加本段是为了对其他答案进行评论。有些人提到,依赖include_path的鲁棒性较差,因此最好使用完整路径,如./path或__DIR__ . /path。有些人甚至说依赖于工作目录.本身是不安全的,因为它可以被更改。然而,有时候,你需要依赖环境价值。例如,您可能希望将include_path设置为空,以便调用脚本的目录是它将搜索的第一个位置,甚至在当前工作目录之前。代码可能已经编写并定期从外部源更新,您不希望每次更新代码时都重新插入前缀__DIR__。
include
include_path
ini_set
.
chdir
./path
__DIR__ . /path
lbsnaicq4#
1.如果包含路径不是以./或../开头,例如:
./
../
include 'C.php'; // precedence: include_path (which include '.' at first), // then path of current `.php` file (i.e. `B.php`), then `.`.
include 'C.php'; // precedence: include_path (which include '.' at first),
// then path of current `.php` file (i.e. `B.php`), then `.`.
1.如果包含路径以./或../开头,例如:
include './C.php'; // relative to '.' include '../C.php'; // also relative to '.'
include './C.php'; // relative to '.'
include '../C.php'; // also relative to '.'
上面的.或..是相对于getcwd()的,默认为条目.php文件的路径(即A.php),用于某些Web服务器,例如Apache。在PHP 5.4.3上测试(构建日期:2012年5月8日00:47:34)。(Also注意chdir()可以改变getcwd()的输出。
..
.php
A.php
chdir()
zynd9foi5#
简短回答:它是相对于包含脚本而言的。TFM正确解释:如果在include_path中找不到该文件,则include将检查调用脚本的目录和当前工作目录因此,如果**/app/main.php表示include("./inc.php"),则会找到/app/inc.php**。
include("./inc.php")
**./**不是绝对必要的,但它删除了对include_path的任何依赖。
我不会依赖于在当前工作目录中查找包含文件,以防有人用chdir()更改它。
uemypmqf6#
dir-> a.php-> c.php- dir2 -> b.php
dir
-> a.php
-> c.php
- dir2
-> b.php
要在b中包含a,您需要include("../a.php");要在c中包含b,您需要include("dir2/b.php");
b
a
include("../a.php");
c
include("dir2/b.php");
6条答案
按热度按时间ff29svar1#
它是相对于主脚本的,在本例中是A.php。请记住,
include()
只是将代码插入到当前运行的脚本中。也就是说,从哪个文件调用include有关系吗
号
如果你想让它变得重要,并且相对于B.php做一个包含,使用
__FILE__
常量(或自PHP 5.2 IIRC起的__DIR__
),它将始终指向代码行所在的文本当前文件。6pp0gazn2#
@Pekka让我在那里,但只是想分享我学到的:
getcwd()
返回您开始执行的文件所在的目录。dirname(__FILE__)
返回包含当前执行代码的文件的目录。使用这两个函数,您总是可以构建一个相对于您需要的包含路径。
例如,如果b.php和c.php共享一个目录,b.php可以包含c.php,如:
无论从何处调用b.php。
事实上,这是建立相对路径的首选方式,因为额外的代码使PHP不必在尝试定位目标文件时遍历include_path。
资料来源:
Difference Between getcwd() and dirname(FILE) ? Which should I use?
Why you should use dirname(FILE)
f3temu5u3#
公认的Pekka的答案是不完整的,在一般情况下,误导。如果文件是作为相对路径提供的,则被调用的语言结构
include
将按以下方式搜索它。首先,它将遍历环境变量
include_path
的路径,可以使用ini_set
进行设置。如果失败,它将在调用脚本自己的目录dirname(__FILE__)
(__DIR__
与php >= 5.3)中搜索。如果这也失败,只有这样,它才会在工作目录中搜索!默认情况下,环境变量include_path
以.
开头,这是当前的工作目录。这是它首先在当前工作目录中搜索的唯一原因。请参见http://php.net/manual/en/function.include.php。根据给定的文件路径包含文件,如果未指定,则根据指定的include_path包含文件。如果在include_path中找不到文件,include将在失败之前最终签入调用脚本的自己目录和当前工作目录。
因此,问题第一部分的正确答案是,包含的调用脚本位于何处确实重要。问题最后一部分的答案是,在Web服务器上下文中,初始工作目录是被调用脚本的目录,该脚本包括PHP处理的所有其他脚本。在命令行上下文中,初始工作目录是php在提示符下被调用时的任何目录,而不一定是被调用脚本所在的目录。但是,当前工作目录可以在运行时使用PHP函数
chdir
进行更改。参见http://php.net/manual/en/function.chdir.php。添加本段是为了对其他答案进行评论。有些人提到,依赖
include_path
的鲁棒性较差,因此最好使用完整路径,如./path
或__DIR__ . /path
。有些人甚至说依赖于工作目录.
本身是不安全的,因为它可以被更改。然而,有时候,你需要依赖环境价值。例如,您可能希望将include_path
设置为空,以便调用脚本的目录是它将搜索的第一个位置,甚至在当前工作目录之前。代码可能已经编写并定期从外部源更新,您不希望每次更新代码时都重新插入前缀__DIR__
。lbsnaicq4#
1.如果包含路径不是以
./
或../
开头,例如:1.如果包含路径以
./
或../
开头,例如:上面的
.
或..
是相对于getcwd()
的,默认为条目.php
文件的路径(即A.php
),用于某些Web服务器,例如Apache。在PHP 5.4.3上测试(构建日期:2012年5月8日00:47:34)。
(Also注意
chdir()
可以改变getcwd()
的输出。zynd9foi5#
简短回答:它是相对于包含脚本而言的。
TFM正确解释:
如果在include_path中找不到该文件,则include将检查调用脚本的目录和当前工作目录
因此,如果**/app/main.php表示
include("./inc.php")
,则会找到/app/inc.php**。**./**不是绝对必要的,但它删除了对include_path的任何依赖。
我不会依赖于在当前工作目录中查找包含文件,以防有人用
chdir()
更改它。uemypmqf6#
要在
b
中包含a
,您需要include("../a.php");
要在
c
中包含b
,您需要include("dir2/b.php");