首页 > PHP–love > php require_once 相对目录要谨慎

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())只有一个区别——如果包含的文件不存在,前者将产生一个致命错误,同时终止脚本的执行;而后者只会产生一个警告。

  1. 各种虾米 七 29th, 2009 @ 21:22 | #1

    :x 完全看不懂

  2. LAONB 七 29th, 2009 @ 23:19 | #2

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

  3. simaopig 七 29th, 2009 @ 23:43 | #3

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

  4. 吖Bee 七 30th, 2009 @ 09:20 | #4

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

  5. simaopig 七 30th, 2009 @ 09:20 | #5

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

  6. simaopig 七 30th, 2009 @ 09:20 | #6

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

  7. 吖Bee 七 30th, 2009 @ 13:32 | #7

    @simaopig
    我基础不过关…哈哈

  8. 小明猪 七 30th, 2009 @ 14:31 | #8

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

  9. simaopig 七 30th, 2009 @ 15:30 | #9

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

  10. simaopig 七 30th, 2009 @ 15:31 | #10

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

  11. beetea 七 30th, 2009 @ 16:11 | #11

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

    discuz里看来得 :D

  12. JiaCheng 七 30th, 2009 @ 21:44 | #12

    各种虾米 :
    完全看不懂

    me too

  13. Deloz 八 7th, 2009 @ 23:14 | #13

    看懂了 :)

  14. jacky 一 25th, 2010 @ 12:46 | #14

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

评论提交中, 请稍候...

留言

可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks