代码说

code is poetry

代码说    
碎碎念:忍字头上一把刀。  换一换

php中嵌套引用文件产生的错误

作者:coderzheng 发布于:2014-10-30 19:00 Thursday 分类:php  阅读模式

A(a.php)包含B(b.php),B包含C(c.php),假设A在根目录下,A、B、C的路径如下:
a.php: /a.php
b.php: /app/b.php
c.php: /app/sub/c.php

如果写成这样:
a.php:
include "./app/b.php"

b.php:
include "./sub/c.php"

直接运行a.php会报错,如下图所示:

这是什么原因呢?
先来看看include引用文件的定义:当使用相对路径的方式进行引用时,文件的基准地址是当前文件的地址。那么,在a.php中基准是a.php文件所在的地址(即/),在b.php中基准是b.php所在的地址(即/app)。表面上看a.php的引用和b.php的引用都没有问题,但是实际上当a.php运行时, include脚本首先正确地寻址到b.php,然后b.php中的脚本继续向后寻址c.php,这一步却失败了。因为此时b.php中include(由于是嵌套引用)的基准地址也被解释成了/(即a.php的地址)!这里要怎样理解呢?
我们可以将include简单地理解为将被包含文件的php代码复制粘贴到当前文件,这样你就能清楚地看到a.php中的include包含了b.php,b.php的代码是"include ./sub/c.php"。忽略中间的一次中转,a.php中的代码相当于直接进行了一次对c.php的引用:include "./sub/c.php";由于/sub/c.php根本不存在,程序就报错了。
这个错误产生的原因,是当使用include进行嵌套引用时,程序无法按照我们的意图自动变换文件的基准地址

因此,为了避免这种情况的产生,一般的处理方法有以下三种:
1) 一律使用绝对地址进行文件寻址,杜绝使用任何形式的相对地址寻址(即使是在js代码中)。dedecms就是采用了这种方式,这种方式有一个缺点,就是在本地环境中使用localhost/的形式创建项目时可能出现问题,见这里

2) 先定义一个ROOT常量(项目根地址),然后每个php文件都包含它,include文件时先将ROOT和必要的文件路径(相对根目录)进行拼接,然后再include。这种方式实际上是1)的一种变换。

3) 每次include文件都采用这种方法:dirname(__FILE__).目标文件相对当前文件的地址,这种方式是1)的另一种变换。


参考阅读:http://www.dewen.io/q/7462/PHP文件嵌套包含

标签: php 疑难杂症

你可以发表评论、引用到你的网站或博客,或通过RSS 2.0订阅这个博客的所有文章。
上一篇: 双系统(win7和linux)重装win7后如何恢复对linux操作系统的引导  |  下一篇:高级程序员、项目经理和架构师