很老的问题了,提了N次,但是我在实际操作中发现总不是那么回事。
先发目录结构:
-ROOT
|_ hello.php
|_ inc
  |_nihao.php
  |_love.phphello.php中的代码:
<?php
require('./inc/nihao.php');
?>nihao.php中的代码:
<?php
require('./love.php');
?>
现在问题出来了,按手册及各位大虾的说法,那么在PHP执行hello.php后里面的代码应该会变成下面这个样子:
<?php
require('./love.php');
?>但是事实是,在root目录下根本就没有love.php这个文件,但是程序竟然能够正常运行,正确的加载./inc/love.php这个路径,那么我就实在是搞不懂PHP到底是如何来处理这个问题了,虽然我现在是采取__dir__的方法能成功解决这个问题,但是,到今天为止都没能搞懂这个问题实在是个遗憾啊!!

解决方案 »

  1.   

    nihao.php中的代码: 
    <?php 
    require('./inc/love.php'); 
    ?> 等于说要把所有调用的东西放在hello.php 
    里面运行
      

  2.   

    nihao中已经包括了love.php
    hello中再包括nihao.php
    哪么hello中就包括了这两个
      

  3.   

    被包含进来的是一个代码片段,如果包含进来的代码里也有require,路径就要按当前文件的路径走,不能按照包含文件里的路径走
    所以最好用绝对路径
      

  4.   


    你的意思是PHP在执行hello.php的时候,先转到inc下去执行nihao.php,然后退回去继续执行hello.php???
      

  5.   

    你的意思是PHP在执行hello.php的时候,先转到inc下去执行nihao.php,然后退回去继续执行hello.php基本是这个意思
      

  6.   

    效果应这样的
    hello.php中的代码:
    <?php
    require('inc/nihao.php');
    ?>nihao.php中的代码:
    <?php
    require('love.php');
    ?> 不要用.来表示目录试试,这个好像没有用
    hello.php 中的引用,表示打开当前目录下的inc/nihao.php文件
    nihao.php中的引用,打开inc/下的love.php文件
    当打开文件时,是严格按目录顺序打开的,如有内容就读内容,如果require则自动跳转
      

  7.   

    . 表示当前目录好象要php.ini中配置我的理解是,如果遇到require,肯定要先跳转执行打能包括进来,而跳转打开时必然会执行PHP,执行PHP显然
    是有路径依赖的
    require('inc/nihao.text'); 试试
      

  8.   

    楼主你是不是把你的目录加到include_path里去了,我刚才按照你的目录桔构试了一下,会报错的Warning: require(./love.php) [function.require]: failed to open stream: No such file or directory in E:\site\we\nihao.php on line 2Fatal error: require() [function.require]: Failed opening required './love.php' (include_path='.;c:\php\includes;E:\site\mvc\library') in E:\site\we\nihao.php on line 2
      

  9.   

    我也测了一下,目录结构跟楼主相同包含是这样写的
    hello.php中的代码: 
    <?php 
    require('./inc/nihao.php'); 
    ?> nihao.php中的代码: 
    <?php 
    require('./love.php'); 
    ?> 
    会报找不到love.php的错误,
    但是如果把./都去掉,就OK
    所以我也迷惑了,同楼主一起期待……
      

  10.   

    把include_path='.;c:\php\includes;E:\site\mvc\library'
    注释掉
    不用.目录
      

  11.   


    很簡單的問題撒,最後得到的是:
    <?php 
    require('./inc/love.php'); 
    ?> 
    不是
    <?php 
    require('./love.php'); 
    ?> 
      

  12.   

    抱歉啊,各位,因为CSDN不能编辑,我的代码里面有一个笔误,实在是抱歉啊!!
    我的代码应该是这样子的:-ROOT 
    ¦_ hello.php 
    ¦_ inc 
       ¦_nihao.php 
       ¦_love.php hello.php中的代码: 
    <?php 
    require('./inc/nihao.php'); 
    ?> nihao.php中的代码: 
    <?php 
    //require('./love.php'); 
    require('love.php'); 
    ?> 
      

  13.   

    你的寫法并沒有問題。
    我的理解是:
    在執行hello.php時候,查找inc/nihao.php文件。在inc/nihao.php文件里遇到require('love.php');  
    再在INC目錄下查找love.php文件,也就是說,是先執行LOVE.PHP,接著NIHAO.PHP。最后才是HELLO.PHP。
      

  14.   

    呵呵
    我每提一次这个问题答案总是会被翻新一次
    郁闷
    难道是PHP内部产生的变化?
      

  15.   

    我也遇到个问题
    -ROOT 
    ¦_ hello.php 
    ¦_ inc 
       |-a.php
       ¦_nihao.php 
       ¦_love.php 
      

  16.   

    包含的时候 是以 $_SERVER['script_name'];的路径为基准
      

  17.   

    楼主说的是一个相对路径的问题,我现在在网吧,没有时间调试。 (偏偏今天放假,偏偏今天家里不能上网,偏偏服务商也放假了)但通常情况下,我会把路径归划一下,找到一个常量做为参考点,来回避关于文件的这种矛盾。
    会有个全局性的文件globalPath  
    define( ROOT ,"/home/httpd/web" );
    php.ini 里面有个auto_predefine 里加上这个文件。hello.php中的代码: 
    <?php 
    require(ROOT .'/inc/nihao.php'); 
    ?> nihao.php中的代码: 
    <?php 
    require( ROOT.'/inc/nihao.php'); 
    ?> 
      

  18.   

    楼上正解了!
    我最近也查一下,最后决定用两个全局常量
    一个表示相对路径字符,define( project_base_Path_V,"www.xxx.com/yoursite") 
    用在http:// .project_base_Path_V.'/xx/xxx'一个表示绝对路径define( project_base_Path_R,dirname(__FILE__)) ); 
    用于require( project_base_Path_R.'/inc/nihao.php');  
    这样,如果是包含,则用绝对路径
    如果不是包含,则用相对字符
      

  19.   

    另一方面,路径引用中也不宜用 $_SEVRER[]变量,因为服务器不是apache时,如win的iis,可能取不到相关环境变量
    据说,dirname(__FILE__)最佳方式
      

  20.   

    今天刚搞明白,说出来大家分享,大家指证!
    用require()之类的多层包含文件,如果是向下或同级目录的,一般没有问题!
    但如果是多层包含,含反向的!
    会出错!出错原因可能是多次包含后相对路径指示清!PHP没这么智能这种情况下要使用绝对咱径!dirname(__FILE__)返回绝对种径,永不会出错!
    所以,要
    比较一下:
    a.php中
    require("abc/b.php");b.php中require("c.php");出错require(dirname(__FILE__)."/c.php");//绝不出错
    require("../../c.php");出错require(dirname(__FILE__)."/../../c.php");//正确所以,定义公用变量也不是最方便的!因为很多页要调用它,仍会有目录问题!因此,如果有权限的化,最方便的是配置include_path路径.就不存在相对路径的问题了!
      

  21.   

    所说的$_SERVER['script_name']; 是值 并不是应用这个变量 完全没有必要require() include() fopen() 这类对文件进行操作的函数不管包含了N次 相对目录的基准永远是 url中对应的文件如 www.123.com/123/234/456.php不管经过多少次包含 相对目录的基准永远是 456.php