美文网首页我爱编程
php使用require()时的注意点

php使用require()时的注意点

作者: 稀饭DD | 来源:发表于2018-03-01 15:25 被阅读0次
    目录层级

    各层级代码如下:

    test.php

    <?php
      require("a/a.php");
    ?>
    

    a.php

    <?php
      require("../b/b.php");
    ?>
    

    b.php

    <?php
      echo "b";
      exit;
    ?>
    

    aaa.php

    <?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()时的注意点

        本文链接:https://www.haomeiwen.com/subject/dumeoxtx.html