很老的问题了,提了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__的方法能成功解决这个问题,但是,到今天为止都没能搞懂这个问题实在是个遗憾啊!!
先发目录结构:
-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__的方法能成功解决这个问题,但是,到今天为止都没能搞懂这个问题实在是个遗憾啊!!
<?php
require('./inc/love.php');
?> 等于说要把所有调用的东西放在hello.php
里面运行
hello中再包括nihao.php
哪么hello中就包括了这两个
所以最好用绝对路径
你的意思是PHP在执行hello.php的时候,先转到inc下去执行nihao.php,然后退回去继续执行hello.php???
hello.php中的代码:
<?php
require('inc/nihao.php');
?>nihao.php中的代码:
<?php
require('love.php');
?> 不要用.来表示目录试试,这个好像没有用
hello.php 中的引用,表示打开当前目录下的inc/nihao.php文件
nihao.php中的引用,打开inc/下的love.php文件
当打开文件时,是严格按目录顺序打开的,如有内容就读内容,如果require则自动跳转
是有路径依赖的
require('inc/nihao.text'); 试试
hello.php中的代码:
<?php
require('./inc/nihao.php');
?> nihao.php中的代码:
<?php
require('./love.php');
?>
会报找不到love.php的错误,
但是如果把./都去掉,就OK
所以我也迷惑了,同楼主一起期待……
注释掉
不用.目录
很簡單的問題撒,最後得到的是:
<?php
require('./inc/love.php');
?>
不是
<?php
require('./love.php');
?>
我的代码应该是这样子的:-ROOT
¦_ hello.php
¦_ inc
¦_nihao.php
¦_love.php hello.php中的代码:
<?php
require('./inc/nihao.php');
?> nihao.php中的代码:
<?php
//require('./love.php');
require('love.php');
?>
我的理解是:
在執行hello.php時候,查找inc/nihao.php文件。在inc/nihao.php文件里遇到require('love.php');
再在INC目錄下查找love.php文件,也就是說,是先執行LOVE.PHP,接著NIHAO.PHP。最后才是HELLO.PHP。
我每提一次这个问题答案总是会被翻新一次
郁闷
难道是PHP内部产生的变化?
-ROOT
¦_ hello.php
¦_ inc
|-a.php
¦_nihao.php
¦_love.php
会有个全局性的文件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');
?>
我最近也查一下,最后决定用两个全局常量
一个表示相对路径字符,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');
这样,如果是包含,则用绝对路径
如果不是包含,则用相对字符
据说,dirname(__FILE__)最佳方式
用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路径.就不存在相对路径的问题了!