公司动态

PHP include的坑:require a.php和require ./a.php竟天差地别,99%程序员踩过

📅 2026/8/23 8:30:17
PHP include的坑:require a.php和require ./a.php竟天差地别,99%程序员踩过
1 绝对路径、相对路径和未确定路径相对路径相对路径指以.开头的路径例如./a/a.php (相对当前目录) ../common.inc.php (相对上级目录)绝对路径绝对路径, 是那种以 / 开头的路径, 或者是像 C:/ 这样以盘符开头的路径, 全路径呢, 是不用任何参考路径就能唯一确定文件最终地址的路径, 例如。/apache/wwwroot/site/a/a.php c:/wwwroot/site/a/a.php未确定路径任何并非以. 或者 / 起始、同样不是下盘符:/ 作为开头的途径, 比如。a/a.php common.inc.php刚开始的时候, 心里觉得这同样是相对路径, 然而, 在php的那种/包含机制里, 这种类别的路径跟以.开头的相对路径处理起来, 那可是全然不一样的。./a.php 和 a.php 是存在差异的接下来, 剖析这三种类型涵盖路径的处置办法: 首先记牢一个结论: 要是包含路径是相对路径或者绝对路径, 那么就不会前往于php.ini里界定的环境变量, 或者在程序之中运用(...)实施设置内里去寻觅此文件。测试环境说明留意, 下述的探讨以及结论是基于这般的环境, 假定A等于空, 再度着重指出, 下面的讨论是针对直接去访问A的情形。2. 相对路径相对路径要借助一个参考目录方可确定文件的最终路径, 在包含解析里, 无论包含嵌套有多少层, 这个参考目录乃是程序执行入口文件所处的目录。示例1A中定义 require ./b/b.php; // 则B[SITE]/app/test/b/b.php B中定义 require ./c.php; // 则C[SITE]/app/test/c.php 不是[SITE]/app/test/b/c.php示例2A中定义 require ./b/b.php; // 则B[SITE]/app/test/b/b.php B中定义 require ../c.php; // 则C[SITE]/app/c.php 不是 [SITE]/app/test/c.php示例3A中定义 require ../b.php; //则B[SITE]/app/b.php B中定义 require ../c.php; //则C[SITE]/app/c.php 不是 [SITE]/c.php示例4:A中定义 require ../b.php; // 则B[SITE]/app/b.php B中定义 require ./c/c.php; / /则C[SITE]/app/test/c/c.php 不是 [SITE]/app/c/c.php示例5A中定义 require ../inc/b.php; // 则B[SITE]/app/inc/b.php B中定义 require ./c/c.php; // 则C还是[SITE]/app/test/c/c.php 不是 [SITE]/app/inc/c/c.php示例6A中定义 require ../inc/b.php; // 则B[SITE]/app/inc/b.php B中定义 require ./c.php; // 则C[SITE]/app/test/c.php 不是 [SITE]/app/inc/c.php3. 绝对路径“绝对路径”比较简易, 不容易因混淆而出现差错, “|”所对应的乃是磁盘里的文件。require /wwwroot/xxx.com/app/test/b.php; // Linux中 require c:/wwwroot/xxx.com/app/test/b.php; // windows中由一系列计算最终得出来的, 同样是具备绝对路径形式的一种目录, 可是需要着重留意的是, 它是一种Magic, 无论处于何时何种状况, 都等同于书写这条特定语句的php文件所处于的绝对路径, 所以这个(), 也始终会指向书写这条语句的php文件所位于的绝对路径, 这与该文件是否被其他文件进行包含使用, 不存在任何关联关系。示例1A中定义 require ../b.php; // 则B[SITE]/app/b.php B中定义 require dirname(__FILE__)./c.php; // 则B[SITE]/app/c.php示例2A中定义 require ../inc/b.php; // 则B[SITE]/app/inc/b.php B中定义 require dirname(__FILE__)./c.php; // 则B[SITE]/app/inc/c.php 始终跟B在同一个目录结论不管B是被A包含使用还是直接被访问B如果 require dirname(__FILE__)./c.php; // 则始终引用到跟B在同一个目录中的 c.php文件; B如果 require dirname(__FILE__)./../c.php; // 则始终引用到B文件所在目录的父目录中的 c.php文件; B如果 require dirname(__FILE__)./c/c.php; // 则始终引用到B文件所在目录的c子目录中的 c.php文件;4. 未确定路径首先在逐一用中定义的包含目录来拼接未确定路径要是能找到存在着的文件, 那就意味着包含成功之后退出, 要是没能够找到, 那就运用执行语句的php文件所处的目录去进行拼接。未确定路径找寻该文件时, 凭借所组成的全路径去查找它, 要是文件存在, 那么就意味着包含成功退出, 要是不然, 那就表明包含文件不存在, 出现差错。有个情况是, 未确定路径比较容易弄混淆因而不建议使用。5. 解决方案因“相对路径”里的“参照目录”乃执行入口文件所处目录, “未确定”路径较易混淆, 所以最佳解决办法是用“绝对路径”, 比如b.php的内容如下, 无论于何处, b.php皆是以b.php的路径为参照前往c.php的。$dir dirname(__FILE__); require($dir . ../c.php);又或者, 去定义一个具备通用性的专门函数.php, 把它设定成是以自动方式提前进行引入文件的操作, 在php.ini里做出如下这般的配置。更改配置项必须auto_prepend_file C:\xampp\htdocs\auto_prepend_file.php 更改配置项可选allow_url_include On.php内容如下function import($path) { $old_dir getcwd(); // 保存原“参照目录” chdir(dirname(__FILE__)); // 将“参照目录”更改为当前脚本的绝对路径 require_once($path); chdir($old_dir); // 改回原“参照目录” }这样一来, 便能够运用()函数去处理文件了, 不管其中涵盖了几级“参照目录”, 统统都是当下的文件, 不论是否复杂