0

0

php中关于使用include(require)嵌套包含文件时的问题需要注意

黄舟

黄舟

发布时间:2017-06-25 10:31:08

|

1958人浏览过

|

来源于php中文网

原创

/** 
* Author:RDP 
* My mail:abel1314520@gmail.com 
* My blog:  http://blog.teamhaka.com
 */


注:以下说明都适用于includeinclude_oncerequirerequire_once

例子基本上都是a.php包含b.php,b.php中包含c.php这样的嵌套包含形式。主要讨论的是a.php和c.php之间的结构关系。其中a.php为入口文件

 

包含文件时的路径其实有三种选择。

分别是

一 绝对路径                                      例:/aaa/bbb/ccc/c.php

二 相对路径(当前目录使用./)           例:./ccc/c.php

三 相对路径(当前目录不使用./)       例:ccc/c.php

关于两个相对路径,可以直观的注意上述(二)和(三)相对路径的不同点。有没有./在嵌套包含文件的时候,会有很大的不同!后文具体说明。

 

一 使用绝对路径的注意点:

直接写绝对路径没有什么好注意的,但是在使用dirname(FILE)来获取当前文件的绝对路径时,要注意无论写这条语句的php文件是否被其他文件所包含,dirname(FILE)都总是指向写这条语句的php文件所在的绝对路径

例:  

作为入口文件的a.php: require './b/b.php';

b.php:require dirname(FILE).'/c.php';

那么在执行a.php时,b.php中的dirname(FILE)得到的是b.php所在的绝对路径,而不是a.php所在的绝对路径。(在此例中意味着b.php和c.php是同属于b目录下的)

 

二 使用相对路径(当前目录使用./)的注意点:

相对路径是以某个目录为基准来确定需要包含的文件所在的位置。相对路径的基准目录就是程序执行的入口文件所在的目录,不管包含嵌套多少层。

例:  

作为入口文件的a.php: require './b/b.php';

b.php: require './c/c.php';  //请注意这里包含c目录时使用的是./  

那么,注意这里的c.php所在的c目录和b目录是同级的,而并非是c目录在b目录的下面。因为b.php中的包含使用了相对路径,而程序入口是a.php,所以b.php包含使用的相对路径应是以入口文件a.php所在目录来作为基准的。

 

三 使用相对路径(当前目录不使用./)的注意点:

分两步处理,首先以程序入口文件所在目录为基准沿相对路径来寻找,找到存在的文件则包含成功退出(和上述的【相对路径(当前目录使用./)】一样)。如果找不到,则走第二步处理。即在写require语句的php文件所在目录来和require中包含的路径进行拼接,还是以入口文件所在目录为基准,沿这个拼接得到的相对路径来搜寻,文件存在则包含成功,否则表示被包含文件不存在。看例子理解比较容易。

例:  

作为入口文件的a.php: require './b/b.php';

b.php: require 'c/c.php';  //请注意这里包含c目录时没有使用./  

那么,首先会在入口文件a.php所在的目录下搜寻c/c.php,如果有,则包含成功。

如果没找到,接下来就将b.php的所在路径(./b/b.php)和b.php中require的路径(c/c.php)进行拼接,得到拼接后的相对路径./b/c/c.php。在入口文件a.php所在的目录下搜寻./b/c/c.php,存在就包含成功,否则即出错。

 

/*******************分割线***********************/

稍微总结下相对路径的嵌套包含。

相对路径的嵌套包含,都是以程序入口文件所在目录为基准来沿相对路径来搜寻需要包含的文件的。

但是如果在相对路径中使用到了当前目录这个概念时,就会有差异。即,使不使用./来表示当前目录,所带来的处理是不一样的。

有./就是以入口文件所在目录为基准来直接搜寻,

没有./,则先以入口文件所在目录为基准来搜寻,找不到的情况下做路径的拼接处理,然后按拼接后的相对路径来搜寻,基准依然是入口文件所在目录。

综合下使用./和不使用./的一个例子

文件结构如下:

/WEBROOT

——–test.php

——–/folder2/test2.php

——–/folder2/folder3/test3.php

作为程序入口的test.php包含test2.php,而test2.php中包含了test3.php。

那么在test2.php中的包含路径的写法有如下差异:

require ('folder2/folder3/test3.php'); //正确! 直接在入口程test.php所在的WEBROOT目录下搜寻folder2/folder3/test3.php  
参考上述的【三 使用相对路径(当前目录不使用./)的注意点】


require ('folder3/test3.php');  //正确! 拼接相对路径然后搜寻  参考上述的【三 使用相对路径(当前目录不使用./)的注意点】


  1. require
     (
    './folder2/folder3/test3.php'
    );  
    //正确!  参考上述的【二 使用相对路径(当前目录使用./)的注意点】


  1. require
     (
    './test3/test3.php'
    );    
    //错误!入口程序test.php所在的WEBROOT目录下并不存在test3这个目录!参考上述的【二 使用相对路径(当前目录使用./)的注意点】

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Word 字间距调整方法汇总
Word 字间距调整方法汇总

本专题整合了Word字间距调整方法,阅读下面的文章了解更详细操作。

2

2025.12.24

任务管理器教程
任务管理器教程

本专题整合了任务管理器相关教程,阅读下面的文章了解更多详细操作。

2

2025.12.24

AppleID格式
AppleID格式

本专题整合了AppleID相关内容,阅读专题下面的文章了解更多详细教程。

0

2025.12.24

csgo视频观看入口合集
csgo视频观看入口合集

本专题整合了csgo观看入口合集,阅读下面的文章了知道更多入口地址。

29

2025.12.24

yandex外贸入口合集
yandex外贸入口合集

本专题汇总了yandex外贸入口地址,阅读下面的文章了解更多内容。

58

2025.12.24

添加脚注通用方法
添加脚注通用方法

本专题整合了添加脚注方法合集,阅读专题下面的文章了解更多内容。

1

2025.12.24

重启电脑教程汇总
重启电脑教程汇总

本专题整合了重启电脑操作教程,阅读下面的文章了解更多详细教程。

3

2025.12.24

纸张尺寸汇总
纸张尺寸汇总

本专题整合了纸张尺寸相关内容,阅读专题下面的文章了解更多内容。

5

2025.12.24

Java Spring Boot 微服务实战
Java Spring Boot 微服务实战

本专题深入讲解 Java Spring Boot 在微服务架构中的应用,内容涵盖服务注册与发现、REST API开发、配置中心、负载均衡、熔断与限流、日志与监控。通过实际项目案例(如电商订单系统),帮助开发者掌握 从单体应用迁移到高可用微服务系统的完整流程与实战能力。

1

2025.12.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP基础入门课程
PHP基础入门课程

共33课时 | 1.9万人学习

Go语言教程手册
Go语言教程手册

共23课时 | 14.2万人学习

PHP课程
PHP课程

共137课时 | 7.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号