首页 > PHP > php require_once 相对目录要谨慎
2009七月29

php require_once 相对目录要谨慎

今天在群里和大家讨论问题。谈到了使用require_once 仍然告诉说类被重定义的问题。于是想起了前几天自己遇到的现象。在这里和大家说一下,今天才想起调查具体原因,如果大家不说的话就快忘了。看来自己凡事果然不经大脑,大脑的二级缓存,及内存,甚至是硬盘都小的可怜。嗯。

假设有如下三个文件, c.php a.php b.php 对应的存放目录为:localhost/ localhost/ localhost/demo

c.php

require_once("a.php");
require_once("demo/b.php");
B::demo();

a.php

class A
{
}

b.php的内容比较有意思,因为它自己要继承 CLASS A 所以自己把a.php也引入进去了

require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}

执行localhost/c.php 系统报错,报错信息如下

Warning: require_once(../a.php) [function.require-once]: failed to open stream: No such file or directory in F:\www\demo\b.php on line 2
Fatal error: require_once() [function.require]: Failed opening required '../a.php' (include_path='.;C:\php5\pear') in F:\www\demo\b.php on line 2

但是,惊奇的发现,如果去掉b.php里面的require_once语句,执行正常,那么一定是require_once语句定义多了吗?原因就是Class A重定义了两次?可是不会啊。如果我只在c.php里面加require_once(‘a.php’);这条语句,哪怕我写两遍也是没错的,那到底是咋回事呢?

原因就是,b.php定义的目录和c.php执行文件的目录层级不一致,导致在c.php里面require_once语句有两条。使其相当于

require_once("a.php");
require_once("../a.php");
class B extends A
{
    public static function demo()
    {
    echo "xx";
    }
}
B::demo();

原因找到了,因为在c.php里面,其相对目录 “..”就是 c.php的上一层了,导致文件找不到报错

所以,我们的结论是,在 PHP 里面,使用require_once的时候,存在不同层级关系,且有相对目录的使用那么一定要谨慎,小心。

PS:在较新版本的PHP中,require(或requier_once())和include()(或include_once())只有一个区别——如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;而后者只会产生一个警告。

文章作者:simaopig
本文地址:http://www.xiaoxiaozi.com/2009/07/29/1264/
版权所有 © 转载时必须以链接形式注明作者和原始出处!

14 Responses to “php require_once 相对目录要谨慎”

  1. #1 各种虾米 回复 | 引用 Post:2009-07-29 21:22

    :x 完全看不懂

    [回复]

  2. #2 LAONB 回复 | 引用 Post:2009-07-29 23:19

    这个我理解了,将来遇到会改了,不过让我自己写还是不行 :D

    [回复]

  3. #3 simaopig 回复 | 引用 Post:2009-07-29 23:43

    @LAONB
    呵呵。反正就是小心谨慎就好。呵。

    [回复]

  4. #4 吖Bee 回复 | 引用 Post:2009-07-30 09:20

    PHP..来学学..我先学好HTML先..哈哈

    [回复]

  5. #5 simaopig 回复 | 引用 Post:2009-07-30 09:20

    @吖Bee
    呵呵,HTML是基础。呵。

    [回复]

  6. #6 simaopig 回复 | 引用 Post:2009-07-30 09:20

    @各种虾米
    呃。。呵,那就挑能看懂的读。

    [回复]

  7. #7 吖Bee 回复 | 引用 Post:2009-07-30 13:32

    @simaopig
    我基础不过关…哈哈

    [回复]

  8. #8 小明猪 回复 | 引用 Post:2009-07-30 14:31

    之前常遇到这种问题,有时候弄的我都想直接把所有文件丢在一个目录下算了 :-|

    [回复]

  9. #9 simaopig 回复 | 引用 Post:2009-07-30 15:30

    @吖Bee
    呵呵,我的不也是嘛。要不然也不会遇到各种奇怪的问题。

    [回复]

  10. #10 simaopig 回复 | 引用 Post:2009-07-30 15:31

    @小明猪
    不同目录层级,引起问题确实会蛮多的,但是无奈啊 :cry:

    [回复]

  11. #11 beetea 回复 | 引用 Post:2009-07-30 16:11

    我一般是
    localhost\主目录\include\xxx.php中define一个主目录的绝对路径
    //****目录的绝对路径****/
    if ( !defined(‘ROOT_PATH’) ) {
    define(“ROOT_PATH”, substr(dirname(__FILE__), 0, -7) );
    }

    discuz里看来得 :D

    [回复]

  12. #12 JiaCheng 回复 | 引用 Post:2009-07-30 21:44

    各种虾米 :
    完全看不懂

    me too

    [回复]

  13. #13 Deloz 回复 | 引用 Post:2009-08-07 23:14

    看懂了 :)

    [回复]

  14. #14 jacky 回复 | 引用 Post:2010-01-25 12:46

    ;-) ;-) :smile: :smile: :mrgreen: :mrgreen: 原来是这样,学习了 :grin: :grin:

    [回复]

发表评论

:wink: :twisted: :roll: :oops: :mrgreen: :lol: :idea: :evil: :cry: :arrow: :?: :-| :-x :-o :-P :-D :-? :) :( :!: 8-O 8)