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())。 |