PHP中include()的使用问题
常常见有人询问关于使用include()时如何定位文件的问题,大体是这样:
这样一个文件系统结构
xxxx--|
|-dirA-|
| |-A.php
| |-A2.php
|
|-dirB-|
|-B.php
A.php
////////////////////////////////////
<?
echo('I am A.php . I have been included .'.'<br/>'.chr(10));
include('A2.php');
?>
////////////////////////////////////
A2.php
////////////////////////////////////
<?
echo('Hello , I am A2.php . I have been included .'.'<br/>'.chr(10));
?>
////////////////////////////////////
B.php
////////////////////////////////////
<?
echo('I am B.php . Now begin .');
include('../dirA/A.php');
?>
////////////////////////////////////
有人会遇到访问B.php报错的情况————无法找到A2.php,便很困惑的来到菜鸟集中营CSDN江湖求助。
看看大家的回答通常都是告诉无辜的提问者去检查一下php.ini中有关include_path的设置是否正确,是否包含了当前路径(用“.”表示)。偶也曾经做了一次不耐烦的大家,现在想起来真是————汗!
在php安装好后,通常php.ini中的inlcude_path被设置为.;c:\php\includes(windows平台)或.:/php/includes(Unix系列平台,Linux),可以看到其中都是包含当前路径的。在一些Php分发中的php.ini中include_path前面用“;”注释掉,这时的inlcude_path内建值为.;c:\php4\pear或.:/php4/pear(其中的“4”是因为我使用的Php版本为4.x)。这样看来,问题通常都不是出在inlude_path变量值上(除非哪个whiteEat非把inlude_path改成外婆家!噢,偶旁边的外婆家酒店酒菜不错,价格公道、童叟无欺)。
其实在上面的大家和提问人之间还有一个常被忽略的事实:Php的版本————这一次是小版本差异。
在Php 4.0.x环境下,上面的例子是无法运行的,需要把A.php中的“include('A2.php');”改成“include('../dirA/A2.php');”,或者将A2.php拷贝一份放到目录dirB中,这通常都不是我们期望的————任务量太大。
而在Php 4.2.x(含更高)环境下,上面的例子则可以通行无阻,并且前面所作修改后的脚本、文件系统结构也可以通过。
清晰了。问题出在不同版本对“.”的解释不同。在4.0.x中,“.”仅仅被认为是(起始)脚本的执行路径;而在4.2.x中,它还包含当前文件的路径。从上面的例子中,当导入文档A.php后,这时的“.”将同时指向B.php的路径dirB和A.php的路径dirA。
写到这里,忽然冒出一个问题:如果在4.2.x环境下,在dirB.php中刚好不幸也有一个A2.php文件,那么B.php最后会导入哪个路径下的A2.php呢?本来想把这个问题留给Php的MM们测试,然后请她们香高天下,但一想到压榨她们不长的几分钟的擦胭抹粉的时间实在于心不忍(“几”是 百 数量级的)。测试结果显示将包含dirB下面的A2.php。
欢迎大家把更多的这类“小”问题贡献出来给我们的菜鸟集中营。
注:上面的例子同样适用于require方法(以及后来的include_once()、require_once())。