php require 找不到,php使用require()时的注意点
目录层级
各层级代码如下:
test.php
require("a/a.php");
?>
a.php
require("../b/b.php");
?>
b.php
echo "b";
exit;
?>
aaa.php
echo "aaa";
exit;
?>
首先test.php能够正确引用到a.php,a.php也能正确引用到b.php,但是访问test.php时报错(无法找到b.php):
test报错
而我们直接访问a.php是能够找到b.php的:
image.png
原因其实是因为php require()默认的引用机制不是相对最近一次引用的路径,而是相对你当前访问的那个文件的路径,a.php和b.php都觉得自己引用与被引用没有问题,但test.php觉得a.php引用b.php的时候出了问题。
于是从test.php的角度看,a.php必须修复代码,把require("../b/b.php")改成require("b/b.php"),这样test就能正常访问到b了。但是新的问题来了,修改之后直接访问a是无法正确引用到b的...
这样的机制稍微一改动就牵扯全身,以下给出两种解决方案和一点注意事项:
引用的时候统一使用绝对路径。这样减少理解成本,且绝不会出错,缺点是显得冗余,且不易看出路径的相对关系
require的时候使用dirname(__FILE__),具体用法可以自行搜索,最后实现的效果是每个文件都只关心自己的引用是正确的,即test只管能正常引用a,a只管正常引用b,那么test就能正常引用b。不过个人不是很推荐这种做法,之后解释原因
注意点:其实引用的这个坑只在内层的引用文件往外层去引用会发生(如上面测试的test.php引用了a.php,而a.php却往上一层的b文件夹里去引用b.php,导致test和b的相对路径混乱,test.php找不到b.php从而报错),但是当我们把a.php里的引用改成require("aaa/aaa.php"),此时理论上test.php应该也是找不到aaa.php的,因为aaa.php对test.php的相对路径应该是a/aaa/aaa.php才对,but奇怪的是并没有出现之前的报错,即这里的问题只会发生在内层往外引用时,当所有引用都是一层层往里时,是没有问题的(改成require("a/aaa/aaa.php")之后test.php依旧可以找到aaa.php,但是a.php会找不到aaa.php的)
对于这种引用机制可以这么理解:php作为一个脚本语言,其require的引用原理就是简单的文本拷贝替换,所以最初test.php的第一行代码require("a/a.php")直接被替换成了a.php的全部内容,即require("../b/b.php"),而test.php根据这样的相对路径找不到b.php,因此报错(假设找到了,同理则把这行require再替换成b.php的全部内容)。
但是这样好像依旧解释不了一层层往里面引用时不会报错的情况。对这种情况有合理解释的欢迎指教。
php require 找不到,php使用require()时的注意点相关推荐
- php中include和require,在PHP中include和require到底有什么区别呢?
在PHP中include和require到底有什么区别呢?看这里的例子就知道了 include.php3的运行结果是: 这是inc1.inc文件中的一个变量的值! 这是inc2.inc文件中的一个变量 ...
- php if require,php echo()和print()、require()和include()函数区别说明
简单总结echo()和print().require()和include()等易混淆函数的区别 1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细 ...
- require用法php,php中的require到底是函数还是语法
语法 Zend/zend_language_scanner.l"eval" { return T_EVAL; } "include" { return T_IN ...
- nodejs中require的路径是一个文件夹时发生了什么
node中使用require的时候如果路径是一个文件夹时,或者特殊的情况require('..');require('.'); 这是node实战这本书里说的情况,但是我在node6.9版本中发现不完全 ...
- vuejs中用require引入图片,出现ReferenceError: require is not defined
data() { return { img:require('-/-/static/logo.png') }; }, script中使用require()报错,出现ReferenceError: re ...
- require的用法 php,PHP 关于require()文件包含的用法详解
以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(FILE)来拼凑文件路 径,不知道这样做有什么好处,后来终于发现了其中的缘由. 我们来看一个简单的例子: 有a,b,c三个p ...
- php warning require,Thinkphp 网站打开提示Warning: require(): open_basedir restriction in effect另一种解决方法...
Thinkphp网站打开报错如下: Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/123.com/ ...
- php require 报错,如何解决php require once报错问题
php require once报错的解决办法:首先找到并打开"php.ini"文件:然后把"display_error=off"改成"display ...
- 安装了但是报错找不到_安装MySQL时由于找不到vcruntime140_1.dll,无法继续安装
从知乎过来不少学习SQL的朋友,反馈在安装MySQL的时候会出现一些无法预料的错误,比如各种找不到dll,或者输入运行代码没反应的情况,今天就来解决一个先. 问题描述: 安装mysql时报错:&quo ...
最新文章
- Java Error(一)
- 一、Java语言基础(4)_方法和数组——数组
- [UI界面]-UIWindow
- 我现在写jquery,你们会不会打我??
- Navicat(服务器对象) -2之MySQL 或 MariaDB 对象
- hp-ux 查看系统负载_linux性能分析之平均负载
- Android 饼状图(MPAndroidChart框架)
- Java 最常见的 200+ 面试题:面试必备
- 关于get和post的区别
- 树莓派pi 4 编译 linuxcnc
- Java项目Maven配置操作Pdf
- 高低压恒流斩波步进电机驱动器设计
- html5微信分享图片不显示,微信分享ios 不显示图片和简介问题总结
- python换照片底色_详解Python给照片换底色(蓝底换红底)
- Linux- 系统随你玩之--文件管理-双生姐妹花
- 忽略证书,下载网络图片
- Java知识点整理(SE) IO
- 01-数据结构和算法入门
- 一部手机失窃引发的惊心动魄的战争
- debian配置BT下载工具transmission-daemon
热门文章
- 时序图 分支_BOOM微架构学习(1)——取指单元与分支预测
- U-Boot 之五 详解 U-Boot 及 SPL 的启动流程
- LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
- 设计模式的理解:状态模式(State) 和备忘录模式(Memento)
- Oracle 原理: 视图,对视图进行增删改操作
- 嵌入式系统存储(RAM、ROM、Flash)
- java datainputstream_Java DataInputStream readUnsignedByte()方法
- jmeter测试udp收发数据
- Selenium Grid Node 安装配置(CentOS 7 版)
- 第一行代码:以太坊(1)-创建自己的私有区块链