require的用法 php,PHP 关于require()文件包含的用法详解
以前看一些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()文件包含的用法详解相关推荐
- 文件包含漏洞全面详解
文件包含漏洞总结 一.什么是文件包含漏洞 二.本地文件包含漏洞(LFI) 三.LFI漏洞利用技巧 1.配合文件上传使用 2.包含Apache日志文件 3.包含SESSION文件 4.包含临时文件 四. ...
- 文件包含漏洞(详解)
1. 文件包含:程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,例如 include "conn.php".php常见的文件包含函数: incl ...
- python源程序文件的扩展名_python程序文件扩展名知识点详解
python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...
- linux系统电脑的权限设置,Linux下的文件权限设置修改详解linux操作系统 -电脑资料...
在linux中更改所属用户组是使用chgrp,更改文件拥有者, chown,更改9个属性, chmod这三种常用的问题,在linxu中这三个命令就是对文件目录权限的控制命令了,下面我来介绍它们的用法与 ...
- Linux如何全盘搜索MySQL文件_Linux上的文件搜索命令实例详解
locate 基础了解 locate命令搜索的后台数据库路径:/var/lib/mlocate/mlocate.db ls -hl /var/lib/mlocate total 1.2M -rw-r- ...
- Linux 执行文件查找命令 which 详解
某个文件不知道放在哪里了,通常可以使用下面的一些命令来查找: which 查看可执行文件的位置 whereis 查看文件的位置 locate 配合数据库查看文件位置 find 实际搜寻硬盘查 ...
- SVN删除文件及其恢复问题详解
SVN删除文件及其恢复问题详解 转自:http://developer.51cto.com/art/201006/203161.htm 本节我们一起来学习一下SVN删除文件及其恢复问题,和大家分享一下 ...
- hadoop文件存储位置_Hadoop文件的存储格式实例详解
sequence文件存储格式 1.txt 纯文本格式,若干行记录.默认用字符编码存储 2.SequenceFile格式(顺序文件格式,可进行切割) key-value 格式进行存储,最终形成的是一个二 ...
- python怎么导入文件-Python文件如何引入?详解引入Python文件步骤
python基本语法--引入Python文件 1.新建python文件 :在同目录lib下创建mylib.py和loadlib.py两个文件 2.在mylib.py文件中创建一个Hello的类 并且给 ...
- STM32固件库文件树及构成详解
(想要pfd格式文件的可以留下邮箱) STM32固件库文件树及构成详解(库版本:STM32F10x_StdPeriph_Lib_V3.5.0) 库减压后所有文件夹构成如下: /
最新文章
- Swift Code Snippet
- 面试:说说你对 Java 中 final 的理解?
- 如何解决Beyond Compare内容相同仍然标示红色
- AIX卷管理介绍以及利用空闲PP来创建文件系统
- vsftpd 的配置项目
- 具有中央异常处理和VO验证的Spring Data JPA –框架
- Cloud一分钟 | 误删生产数据库血案,顺丰高级工程师被开除;阿里巴巴暂停美国云计算扩张?阿里云总裁正式回应:“不会减少投入”...
- Java IDEA使用详解
- Win11 BitLocker驱动器加密怎么使用
- python诞生日期_Python中的时间与日期
- OMNeT 例程 Tictoc12 学习笔记
- 你真的搞懂Class,class了么?
- 一分钟让你了解蓝桥杯(电子类)单片机比赛规则
- .net core 3.1 WebApi项目/Swagger支持二级目录
- CAS单点登录四-单点登出
- Revit二次开发之族库管理系统
- 浙江省2022年职称评审申报流程
- 如何编程访问(读,写)Revit项目信息
- C中最复杂难懂的一行代码
- 神舟十二号发射,VR全景让航天科技离民众更亲近