以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(FILE)来拼凑文件路 径,不知道这样做有什么好处,后来终于发现了其中的缘由。

我们来看一个简单的例子:

有a,b,c三个php文件。a.php在网站根目录,b.php在b文件夹下——b/b.php,c.php在 c文件夹下——c/c.php。有些混乱?看图就一目了然了:

a.php 和 b.php 都包含了 c.php,最后 c.php 包含了d文件夹下的一个php文件 ——d/d.php。

我们先来看a.php:<?php

$file_name = 'a.php';

echo "this is a.php";

echo "


";

require('c/c.php');

?>

很简单的代码,打印输出后,包含了c/c.php,接着,我们需要看c/c.php:<?php

$c_file_name = 'c.php';

echo 'this is c.php, is required by ' . $file_name;

echo "


";

require('../d/d.php');

?>

打印输出 "this is c.php, is required by a.php",$file_name是在a.php中定义的变 量。在最后,包含了d.php。因为d文件夹在当前c.php文件的上一层,所以,按照常理,我们会理所当 然的把路径写成 "../d/d.php"。但是很遗憾,会报错。原因在于,在被包含的文件中如 c.php,再去包含其他文件,路径是相对于最外层的父文件来说的,也就是相对于a.php,可以理解为因 为你被我包含了,所以你要以我为准。看起来很玄乎,原理其实很简单:你可以把 require ('c/c.php'); 看成是c/c.php文件里的代码,这样我们的a.php看起来可以是这个样子:<?php

$file_name = 'a.php';

echo "this is a.php";

echo "


";

// require('c/c.php');

$c_file_name = 'c.php';

echo 'this is c.php, is required by ' . $file_name;

echo "


";

require('../d/d.php');

?>

到此,你可以看到,我们要包含d/d.php文件时,刚才的路径是不是错误的了?因为,现在是在 a.php的代码里,我们是相对于a.php文件来说的,当然,路径应该是 require('d/d.php'); 才对了。 我们修改代码如下:<?php

$file_name = 'a.php';

echo "this is a.php";

echo "


";

// require('c/c.php');

$c_file_name = 'c.php';

echo 'this is c.php, is required by ' . $file_name;

echo "


";

require('d/d.php');

?>

此时,你还没有领悟到深意,需要往下看,我们再看b/b.php:<?php

$file_name = 'b.php';

echo "this is b.php";

echo "


";

require('../c/c.php');

?>

不需要解释了吧,没啥问题,但是当你把 require('../c/c.php'); 换成 c/c.php 里面的代码的时 候,你就会发现问题了,注意,我们刚才修改了c/c.php里的代码,把 require('../d/d.php'); 改成 了 require('d/d.php'); 看下面包含进来后的代码:<?php

$file_name = 'b.php';

echo "this is b.php";

echo "


";

// require('../c/c.php');

$c_file_name = 'c.php';

echo 'this is c.php, is required by ' . $file_name;

echo "


";

require('d/d.php');

?>

那么,相对于 b/b.php 来说,require('d/d.php'); 的路径错了,应该是 require ('../d/d.php'); 才对。你回去修改 c/c.php 中的require路径,但是不对呀,你改了之后,b/b.php 可以正常运行了,但是 a/a.php 又不行了,是不是,它们共用 c/c.php ,牵一发动全身,怎么办呢。

这个时候,我们回到文章开头提到的 dirname(FILE),这可是个好东西,可以完全解决以上问 题。用了它,就可以不用关心包含你的文件是哪个文件、在哪个路径下面了,不需要顾虑父文件所在的 层级,因为,dirname(FILE)可以相对于当前文件指定路径。也就是说,我们需要将我们的 c/c.php 中的 require 路径换为:<?php

$c_file_name = 'c.php';

echo 'this is c.php, is required by ' . $file_name;

echo "


";

require(dirname(FILE) . '/../d/d.php');

?>

这里,我们只需要把 c/c.php 作为参照,相对于它来说,d/d.php 在上一层。这样,就只有一个标 准了,那就是,以我为准,管你包含我,还是他包含我,我只以我自己为准,我要包含的文件只相对于 我自己而言了。

对于 dirname(FILE) 不明白的同修,请google,很简单。

require的用法 php,PHP 关于require()文件包含的用法详解相关推荐

  1. 文件包含漏洞全面详解

    文件包含漏洞总结 一.什么是文件包含漏洞 二.本地文件包含漏洞(LFI) 三.LFI漏洞利用技巧 1.配合文件上传使用 2.包含Apache日志文件 3.包含SESSION文件 4.包含临时文件 四. ...

  2. 文件包含漏洞(详解)

    1. 文件包含:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,例如 include "conn.php".php常见的文件包含函数: incl ...

  3. python源程序文件的扩展名_python程序文件扩展名知识点详解

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

  4. linux系统电脑的权限设置,Linux下的文件权限设置修改详解linux操作系统 -电脑资料...

    在linux中更改所属用户组是使用chgrp,更改文件拥有者, chown,更改9个属性, chmod这三种常用的问题,在linxu中这三个命令就是对文件目录权限的控制命令了,下面我来介绍它们的用法与 ...

  5. Linux如何全盘搜索MySQL文件_Linux上的文件搜索命令实例详解

    locate 基础了解 locate命令搜索的后台数据库路径:/var/lib/mlocate/mlocate.db ls -hl /var/lib/mlocate total 1.2M -rw-r- ...

  6. Linux 执行文件查找命令 which 详解

    某个文件不知道放在哪里了,通常可以使用下面的一些命令来查找: which  查看可执行文件的位置 whereis 查看文件的位置 locate   配合数据库查看文件位置 find   实际搜寻硬盘查 ...

  7. SVN删除文件及其恢复问题详解

    SVN删除文件及其恢复问题详解 转自:http://developer.51cto.com/art/201006/203161.htm 本节我们一起来学习一下SVN删除文件及其恢复问题,和大家分享一下 ...

  8. hadoop文件存储位置_Hadoop文件的存储格式实例详解

    sequence文件存储格式 1.txt 纯文本格式,若干行记录.默认用字符编码存储 2.SequenceFile格式(顺序文件格式,可进行切割) key-value 格式进行存储,最终形成的是一个二 ...

  9. python怎么导入文件-Python文件如何引入?详解引入Python文件步骤

    python基本语法--引入Python文件 1.新建python文件 :在同目录lib下创建mylib.py和loadlib.py两个文件 2.在mylib.py文件中创建一个Hello的类 并且给 ...

  10. STM32固件库文件树及构成详解

    (想要pfd格式文件的可以留下邮箱) STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0) 库减压后所有文件夹构成如下: /

最新文章

  1. Swift Code Snippet
  2. 面试:说说你对 Java 中 final 的理解?
  3. 如何解决Beyond Compare内容相同仍然标示红色
  4. AIX卷管理介绍以及利用空闲PP来创建文件系统
  5. vsftpd 的配置项目
  6. 具有中央异常处理和VO验证的Spring Data JPA –框架
  7. Cloud一分钟 | 误删生产数据库血案,顺丰高级工程师被开除;阿里巴巴暂停美国云计算扩张?阿里云总裁正式回应:“不会减少投入”...
  8. Java IDEA使用详解
  9. Win11 BitLocker驱动器加密怎么使用
  10. python诞生日期_Python中的时间与日期
  11. OMNeT 例程 Tictoc12 学习笔记
  12. 你真的搞懂Class,class了么?
  13. 一分钟让你了解蓝桥杯(电子类)单片机比赛规则
  14. .net core 3.1 WebApi项目/Swagger支持二级目录
  15. CAS单点登录四-单点登出
  16. Revit二次开发之族库管理系统
  17. 浙江省2022年职称评审申报流程
  18. 如何编程访问(读,写)Revit项目信息
  19. C中最复杂难懂的一行代码
  20. 神舟十二号发射,VR全景让航天科技离民众更亲近

热门文章

  1. unity gizmo绘制圆形帮助调试
  2. 半小时速通Python标准库os
  3. Quartus II 的下载及安装
  4. 对比:空洞卷积与转置卷积(吉米王)
  5. Win系统 - 怎么样卸载 Win10 更新补丁,如何删除系统安全补丁
  6. 密码学的安全性浅析4
  7. 【ubuntu】Ubuntu 安装中文输入法
  8. SVG互动排版公众号图文 『两次物体移动与展开长图』 模板代码
  9. strassen矩阵乘法 java_矩阵乘法Strassen算法
  10. 利用Python处理excel表格数据