目录层级

各层级代码如下:

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()时的注意点相关推荐

  1. php中include和require,在PHP中include和require到底有什么区别呢?

    在PHP中include和require到底有什么区别呢?看这里的例子就知道了 include.php3的运行结果是: 这是inc1.inc文件中的一个变量的值! 这是inc2.inc文件中的一个变量 ...

  2. php if require,php echo()和print()、require()和include()函数区别说明

    简单总结echo()和print().require()和include()等易混淆函数的区别 1.echo和print的区别 PHP中echo和print的功能基本相同(输出),但是两者之间还是有细 ...

  3. require用法php,php中的require到底是函数还是语法

    语法 Zend/zend_language_scanner.l"eval" { return T_EVAL; } "include" { return T_IN ...

  4. nodejs中require的路径是一个文件夹时发生了什么

    node中使用require的时候如果路径是一个文件夹时,或者特殊的情况require('..');require('.'); 这是node实战这本书里说的情况,但是我在node6.9版本中发现不完全 ...

  5. vuejs中用require引入图片,出现ReferenceError: require is not defined

    data() { return { img:require('-/-/static/logo.png') }; }, script中使用require()报错,出现ReferenceError: re ...

  6. require的用法 php,PHP 关于require()文件包含的用法详解

    以前看一些PHP框架源码的时候,很奇怪在文件包含的时候,会用dirname(FILE)来拼凑文件路 径,不知道这样做有什么好处,后来终于发现了其中的缘由. 我们来看一个简单的例子: 有a,b,c三个p ...

  7. php warning require,Thinkphp 网站打开提示Warning: require(): open_basedir restriction in effect另一种解决方法...

    Thinkphp网站打开报错如下: Warning: require(): open_basedir restriction in effect. File(/www/wwwroot/123.com/ ...

  8. php require 报错,如何解决php require once报错问题

    php require once报错的解决办法:首先找到并打开"php.ini"文件:然后把"display_error=off"改成"display ...

  9. 安装了但是报错找不到_安装MySQL时由于找不到vcruntime140_1.dll,无法继续安装

    从知乎过来不少学习SQL的朋友,反馈在安装MySQL的时候会出现一些无法预料的错误,比如各种找不到dll,或者输入运行代码没反应的情况,今天就来解决一个先. 问题描述: 安装mysql时报错:&quo ...

最新文章

  1. Java Error(一)
  2. 一、Java语言基础(4)_方法和数组——数组
  3. [UI界面]-UIWindow
  4. 我现在写jquery,你们会不会打我??
  5. Navicat(服务器对象) -2之MySQL 或 MariaDB 对象
  6. hp-ux 查看系统负载_linux性能分析之平均负载
  7. Android 饼状图(MPAndroidChart框架)
  8. Java 最常见的 200+ 面试题:面试必备
  9. 关于get和post的区别
  10. 树莓派pi 4 编译 linuxcnc
  11. Java项目Maven配置操作Pdf
  12. 高低压恒流斩波步进电机驱动器设计
  13. html5微信分享图片不显示,微信分享ios 不显示图片和简介问题总结
  14. python换照片底色_详解Python给照片换底色(蓝底换红底)
  15. Linux- 系统随你玩之--文件管理-双生姐妹花
  16. 忽略证书,下载网络图片
  17. Java知识点整理(SE) IO
  18. 01-数据结构和算法入门
  19. 一部手机失窃引发的惊心动魄的战争
  20. debian配置BT下载工具transmission-daemon

热门文章

  1. 时序图 分支_BOOM微架构学习(1)——取指单元与分支预测
  2. U-Boot 之五 详解 U-Boot 及 SPL 的启动流程
  3. LoRa 之一 旧版驱动(sx12xxDrivers-V2.1.0)移植及驱动架构详解
  4. 设计模式的理解:状态模式(State) 和备忘录模式(Memento)
  5. Oracle 原理: 视图,对视图进行增删改操作
  6. 嵌入式系统存储(RAM、ROM、Flash)
  7. java datainputstream_Java DataInputStream readUnsignedByte()方法
  8. jmeter测试udp收发数据
  9. Selenium Grid Node 安装配置(CentOS 7 版)
  10. 第一行代码:以太坊(1)-创建自己的私有区块链