PHP中include()的使用問題 (轉)

amyz發表於2007-11-12
PHP中include()的使用問題 (轉)[@more@]

中include()的使用問題

常常見有人詢問關於使用include()時如何定位的問題,大體是這樣:
這樣一個檔案結構
xxxx--|
  |-dirA-|
  |  |-A.php
  |  |-A2.php
  |
  |-dirB-|
  |-B.php

A.php
////////////////////////////////////

echo('I am A.php . I have been included .'.'
'.chr(10));
include('A2.php');
?>
////////////////////////////////////

A2.php
////////////////////////////////////

echo('Hello , I am A2.php . I have been included .'.'
'.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:phpincludes(平臺)或.:/php/includes(系列平臺,),可以看到其中都是包含當前路徑的。在一些Php分發中的php.ini中include_path前面用“;”註釋掉,這時的inlcude_path內建值為.;c: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())。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-981873/,如需轉載,請註明出處,否則將追究法律責任。

相關文章