嵌套文件包含路径问题|学习笔记

简介: 快速学习嵌套文件包含路径问题

开发者学堂课程【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 文件。

image.png

在被包含的 parent.php 文件中,包含子文件夹中的文件,在 parent 文件夹中新建一个 son 文件夹,在 son 文件夹中新建一个 son.php 文件;只做一个输出作用

输入代码:include './son/son.php’;在这里包含当前目录下的 son.php 文件。

image.png

打开执行网页访问 parent/parent.php,输出结果如下:

首先 parent.php 先输出自己,然后再包含 son,son 中包含了对自己的路径 son.php 文件。

image.png

打开执行网页访问 54include.php,54include.php 是 son 的上级的上级,也是 parent 的上级,执行结果如下:parent.php 找到了,但是继续执行 son 的时候出现报错,报错原因找不到 ./son/son.php

image.png

原因在于 include 包含了 parent 文件,即可以将创建 parent 文件代码直接输入至 include 中,如图:

image.png

上述代码就是 parent 文件,执行时在当前目录下不会报错;当再往下执行 ./son/son.php时,./ 为当前目录,而当前目录为 54include.php 的目录,即当前目录为 htdocs,所以执行时系统会去 htdocs 下找一个名为 son 的文件夹,但 son 的文件夹不在此处。但将./去掉后,执行效果如下:说明当前的 include 是生效的,只是带有./的 include 是无效的

image.png

将带有./的 include 注释后,执行效果如下:

image.png

两种结果出现的原因就是当前 parent.php 中的 include ’son/son.php';没有用./,所以执行时系统会进入 son/son.php 文件所在的位置,也就是 parent 文件夹,然后再往下面找;而./每个文件夹都有,所以出现报错情况。

echo getcwd()函数会获取当前的一个工作路径,就能看到当前的工作路径在 htdocs 中,在 htdocs 中就说明下面要执行的代码会自行拼接到 htdocs 后,所以就会变成 htdocs 下面去找 son,自然就找不到了。

image.png

但用 include 'son/son.php’; 方式就不会出错,就是因为这种方式能记住原本所在的路径 parent 文件夹。

image.png

注意:

1、独立访问 b.php 和 c.php 都没有问题

例如独立访问 son.php,输入执行代码 parent/son/son.php

image.png

2、访问 a.php,那么当前的工作路径就是 A 文件夹,b.php 是在 A 目录工作,所以 b.php 的./目录属于 A,因此找不到 A 文件夹下的 C 文件夹


三、小结

1、文件嵌套包含时./和../容易产生路径错乱问题

• 每个文件夹下都有./和../(系统只会就近匹配,不能区分原本的./)

• 脚本中的./和../是根据实际工作目录(被请求工作目录)而定,而不是文件所在目录

2、为了避免出现嵌套路径问题,我们可以用以下解决方案

• 不使用相对路径./和../包含文件

• 使用绝对路径包含文件(不会出错,推荐使用)

• 所有文件都放到一个文件夹下(几乎不可能,不利于维护)

相关文章
|
Linux
Linux查找多个文件、排除某类文件、匹配文件多处内容
Linux查找多个文件、排除某类文件、匹配文件多处内容
108 0
|
6月前
|
弹性计算 运维 Shell
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
php案例:加限定条件(只找某个路径下自己所需要的文件类型的信息)
|
6月前
|
C语言
日常知识点之编译运行时识别头文件目录或者链接库目录设置
日常知识点之编译运行时识别头文件目录或者链接库目录设置
74 0
|
C++
C++分文件编写:拆类(.h和.cpp文件)
C++分文件编写:拆类(.h和.cpp文件)
131 0
|
存储 安全 Shell
|
安全 PHP Apache
文件包含路径|学习笔记
快速学习文件包含路径
136 0
文件包含路径|学习笔记
|
安全 PHP 开发者
文件包含区别|学习笔记
快速学习文件包含区别
文件包含区别|学习笔记
|
小程序
小程序当你不知道路径怎么写的时候,就全部使用绝对路径
小程序当你不知道路劲怎么写的时候,就全部使用绝对路径
185 0
c#程序片段,替换所有同名文件
class Program { static void Main(string[] args) { try { ...
873 0