以前总是被教育,不要使用相对路径,这样性能比较差,但是相对路径的问题不仅仅是性能哦,看下面这里例子
这是项目结构
.
├── main.php
├── t
│ ├── t1.php
│ └── t2.php
└── t2.php
main.php
<?php
include __DIR__ . "/t1.php";
include "t2/t1.php";
t1.php
<?php
include_once "t2.php";
echo __FILE__,PHP_EOL;
两个t2.php都是
<?php
echo __FILE__,PHP_EOL;
在运行php main.php 并没有像我们预期的一样输出三个文件的路径
/opt/project/t2.php
/opt/project/t/t1.php
而是值输出了两个,为什么呢?
如果把include_once改成include,就能看出一些端倪
/opt/project/t2.php
/opt/project/t2.php
/opt/project/t/t1.php
看出来了吗?项目根目录下的t2.php被include两遍
被包含文件先按参数给出的路径寻找,如果没有给出目录(只有文件名)时则按照 include_path 指定的目录寻找。如果在 include_path 下没找到该文件则 include 最后才在调用脚本文件所在的目录和当前工作目录下寻找
这句话摘自官方手册 http://php.net/manual/zh/function.include.php
从手册上这段描述可以看出,如果是同名文件,相对路径项目根目录的优先级大于脚本所在的当前目录,所以就出现了上面的现象。
所以,include|require 不要用相对路径。
更多架构、PHP、GO相关踩坑实践技巧请关注我的公众号:PHP架构师