php require 找不到,php使用require()时的注意点

7c185b41a15a

目录层级

各层级代码如下:

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):

7c185b41a15a

test报错

而我们直接访问a.php是能够找到b.php的:

7c185b41a15a

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的全部内容)。

但是这样好像依旧解释不了一层层往里面引用时不会报错的情况。对这种情况有合理解释的欢迎指教。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值