开发者学堂课程【PHP 基础入门课程(下):嵌套文件包含路径问题】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/710/detail/12652
嵌套文件包含路径问题
内容简介:
一、嵌套文件包含路径问题的概念
二、 举例解析嵌套文件包含路径问题
三、小结
一、嵌套文件包含路径问题的概念
嵌套包含路径问题:指的是在进行文件包含时使用了相对路径(./或者../),而且文件又有嵌套包含,导致./或者../无法正确识别路径
• 每个文件夹下都有./和../
• 嵌套包含会让系统无法正确原文件中./和../到底从哪开始
• 系统永远从当前工作目录的./和/开始寻找
二、举例解析嵌套文件包含路径问题
举例说明:
1.A 文件夹中有文件 a.php 和 B 文件夹
2.B 文件夹中有 b.php 和 C 文件夹
3.c 文件夹中有 c.php
4.a.php 包含 b.php,同时 b.php 包含 c.php
5.访问 a.php
新建一个54include.php 文件,假设为 a 文件
a 作为顶级文件(也称被请求文件),这时 a 文件有一个同级目录 parent,parent 中有 parent.php 文件,输入代码:include './parent/parent.php’;
在这里包含当前目录 parent 下的 parent.php 文件。
在被包含的 parent.php 文件中,包含子文件夹中的文件,在 parent 文件夹中新建一个 son 文件夹,在 son 文件夹中新建一个 son.php 文件;只做一个输出作用
输入代码:include './son/son.php’;
在这里包含当前目录下的 son.php 文件。
打开执行网页访问 parent/parent.php,输出结果如下:
首先 parent.php 先输出自己,然后再包含 son,son 中包含了对自己的路径 son.php 文件。
打开执行网页访问 54include.php,54include.php 是 son 的上级的上级,也是 parent 的上级,执行结果如下:parent.php 找到了,但是继续执行 son 的时候出现报错,报错原因找不到 ./son/son.php
原因在于 include 包含了 parent 文件,即可以将创建 parent 文件代码直接输入至 include 中,如图:
上述代码就是 parent 文件,执行时在当前目录下不会报错;当再往下执行 ./son/son.php
时,./ 为当前目录,而当前目录为 54include.php 的目录,即当前目录为 htdocs,所以执行时系统会去 htdocs 下找一个名为 son 的文件夹,但 son 的文件夹不在此处。但将./去掉后,执行效果如下:说明当前的 include 是生效的,只是带有./的 include 是无效的
将带有./的 include 注释后,执行效果如下:
两种结果出现的原因就是当前 parent.php 中的 include ’son/son.php';
没有用./,所以执行时系统会进入 son/son.php 文件所在的位置,也就是 parent 文件夹,然后再往下面找;而./每个文件夹都有,所以出现报错情况。
echo getcwd()
函数会获取当前的一个工作路径,就能看到当前的工作路径在 htdocs 中,在 htdocs 中就说明下面要执行的代码会自行拼接到 htdocs 后,所以就会变成 htdocs 下面去找 son,自然就找不到了。
但用 include 'son/son.php’;
方式就不会出错,就是因为这种方式能记住原本所在的路径 parent 文件夹。
注意:
1、独立访问 b.php 和 c.php 都没有问题
例如独立访问 son.php,输入执行代码 parent/son/son.php
2、访问 a.php,那么当前的工作路径就是 A 文件夹,b.php 是在 A 目录工作,所以 b.php 的./目录属于 A,因此找不到 A 文件夹下的 C 文件夹
三、小结
1、文件嵌套包含时./和../容易产生路径错乱问题
• 每个文件夹下都有./和../(系统只会就近匹配,不能区分原本的./)
• 脚本中的./和../是根据实际工作目录(被请求工作目录)而定,而不是文件所在目录
2、为了避免出现嵌套路径问题,我们可以用以下解决方案
• 不使用相对路径./和../包含文件
• 使用绝对路径包含文件(不会出错,推荐使用)
• 所有文件都放到一个文件夹下(几乎不可能,不利于维护)