第N次询问包含文件问题,盼对require()了解的人给一个明确的答复!

tianyaxiao 2008-03-24 12:25:35
很老的问题了,提了N次,但是我在实际操作中发现总不是那么回事。
先发目录结构:
-ROOT
|_ hello.php
|_ inc
|_nihao.php
|_love.php

hello.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__的方法能成功解决这个问题,但是,到今天为止都没能搞懂这个问题实在是个遗憾啊!!
...全文
169 点赞 收藏 27
写回复
27 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
wxdqz 2008-04-08
多级包含时,用相对目录,会出错
回复
fxs_2008 2008-04-06
不太理解楼上的意思!
只是多级包含时,用相对目录,会出错!
回复
ten789 2008-04-05
所说的$_SERVER['script_name']; 是值 并不是应用这个变量 完全没有必要

require() include() fopen() 这类对文件进行操作的函数不管包含了N次 相对目录的基准永远是 url中对应的文件

如 www.123.com/123/234/456.php

不管经过多少次包含 相对目录的基准永远是 456.php

回复
fxs_2008 2008-04-05
今天刚搞明白,说出来大家分享,大家指证!
用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路径.就不存在相对路径的问题了!
回复
fxs_2008 2008-04-05
另一方面,路径引用中也不宜用 $_SEVRER[]变量,因为服务器不是apache时,如win的iis,可能取不到相关环境变量
据说,dirname(__FILE__)最佳方式
回复
fxs_2008 2008-04-05
楼上正解了!
我最近也查一下,最后决定用两个全局常量
一个表示相对路径字符,

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');
这样,如果是包含,则用绝对路径
如果不是包含,则用相对字符
回复
striker_un 2008-04-04
楼主说的是一个相对路径的问题,我现在在网吧,没有时间调试。 (偏偏今天放假,偏偏今天家里不能上网,偏偏服务商也放假了)

但通常情况下,我会把路径归划一下,找到一个常量做为参考点,来回避关于文件的这种矛盾。
会有个全局性的文件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');
?>

回复
ten789 2008-04-04
包含的时候 是以 $_SERVER['script_name'];的路径为基准
回复
fxs_2008 2008-04-04
我也遇到个问题
-ROOT
¦_ hello.php
¦_ inc
|-a.php


¦_nihao.php
¦_love.php
回复
tianyaxiao 2008-04-04
呵呵
我每提一次这个问题答案总是会被翻新一次
郁闷
难道是PHP内部产生的变化?
回复
wwx840723 2008-03-25
你的寫法并沒有問題。
我的理解是:
在執行hello.php時候,查找inc/nihao.php文件。在inc/nihao.php文件里遇到require('love.php');
再在INC目錄下查找love.php文件,也就是說,是先執行LOVE.PHP,接著NIHAO.PHP。最后才是HELLO.PHP。
回复
tianyaxiao 2008-03-25
抱歉啊,各位,因为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');
?>
回复
wwx840723 2008-03-25
[Quote=引用楼主 tianyaxiao 的帖子:]
很老的问题了,提了N次,但是我在实际操作中发现总不是那么回事。
先发目录结构:
-ROOT
¦_ hello.php
¦_ inc
¦_nihao.php
¦_love.php

hello.php中的代码:
<?php
require('./inc/nihao.php');
?>

nihao.php中的代码:
<?php
require('./love.php');
?>


现在问题出来了,按手册及各位大虾的说法,那么在PHP执行hello.php后里面的代码应该会变成下面这个样子:
<?php
require('.…
[/Quote]

很簡單的問題撒,最後得到的是:
<?php
require('./inc/love.php');
?>
不是
<?php
require('./love.php');
?>
回复
wangbo_wb 2008-03-25
刚才又试了一下,写点报错,不写点不报错,我也迷糊了
回复
richard_ma 2008-03-25
同意16楼的说法,文件的执行顺序是栈结构
回复
fxs_2008 2008-03-25
把include_path='.;c:\php\includes;E:\site\mvc\library'
注释掉
不用.目录
回复
fify2046 2008-03-25
我也测了一下,目录结构跟楼主相同包含是这样写的
hello.php中的代码:
<?php
require('./inc/nihao.php');
?>

nihao.php中的代码:
<?php
require('./love.php');
?>
会报找不到love.php的错误,
但是如果把./都去掉,就OK
所以我也迷惑了,同楼主一起期待……
回复
wangbo_wb 2008-03-25
楼主你是不是把你的目录加到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 2

Fatal 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
回复
tianyaxiao 2008-03-24
[Quote=引用 4 楼 wangbo_wb 的回复:]
被包含进来的是一个代码片段,如果包含进来的代码里也有require,路径就要按当前文件的路径走,不能按照包含文件里的路径走
所以最好用绝对路径
[/Quote]
那你怎么解释我提到问题?为什么这么做它能够正常执行?
回复
tianyaxiao 2008-03-24
[Quote=引用 3 楼 my_web 的回复:]
nihao中已经包括了love.php
hello中再包括nihao.php
哪么hello中就包括了这两个
[/Quote]

你的意思是PHP在执行hello.php的时候,先转到inc下去执行nihao.php,然后退回去继续执行hello.php???
回复
加载更多回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2008-03-24 12:25
社区公告
暂无公告