include加載文件順序
尋找包含文件的順序是:
首先在當前工作目錄的相對的 include_path 下尋找,
然後是當前運行腳本所在目錄相對的 include_path 下尋找。
例如 include_path 是 .,當前工作目錄是 /includetest/,腳本中要 include 一個 includetest/a.php 並且在該文件中有一句 include “b.php”,則尋找 b.php 的順序先是 /includetest/,然後是 /includetest/include/。如果文件名以 ./ 或者 ../ 開始,則只在當前工作目錄相對的 include_path 下尋找。
代碼結構如下:
~/public_html/includetest> ls -R
.:
a.php b.php include
./include:
a.php b.php其中各文件代碼為:
~/public_html/includetest> cat a.php
<?php
set_include_path(".");
include "include/a.php";
echo __FILE__ . PHP_EOL;
~/public_html/includetest> cat b.php
<?php
echo __FILE__ . PHP_EOL;
~/public_html/includetest> cat include/a.php
<?php
include "b.php";
echo __FILE__ . PHP_EOL;
~/public_html/includetest> cat include/b.php
<?php
echo __FILE__ . PHP_EOL;輸出結果為:
~/public_html/includetest> php a.php
# 可以看到include/a.php中include "b.php";會先加載includetest/b.php文件
/home/zhanhailiang/public_html/includetest/b.php
/home/zhanhailiang/public_html/includetest/include/a.php
/home/zhanhailiang/public_html/includetest/a.php注意:工作目錄與運行腳本所在目錄的概念區別。
include變量作用域
當一個文件被包含時,其中所包含的代碼繼承了 include 所在行的變量范圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也都可用。不過所有在包含文件中定義的函數和類都具有全局作用域。
代碼如下:
~/public_html/includetest> cat c.php
<?php
include "d.php";
echo $d.PHP_EOL;
e();
~/public_html/includetest> cat d.php
<?php
$d = "hello world";
function e() {
echo "hello world, e()".PHP_EOL;
}
~/public_html/includetest> php c.php
hello world
hello world, e()相應地,如果 include 出現於調用文件中的一個函數裡,則被調用的文件中所包含的所有代碼將表現得如同它們是在該函數內部定義的一樣。所以它將遵循該函數的變量范圍。 An exception to this rule are magic constants which are evaluated by the parser before the include occurs.
include代碼執行
當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式並進入 HTML 模式,到文件結尾處恢復。由於此原因,目標文件中應被當作 PHP代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。
include處理遠程文件
如果“URL fopen wrappers”在 PHP 中被激活(默認配置),可以用 URL(通過 HTTP 或者其它支持的封裝協議——所支持的協議見支持的協議和封裝協議)而不是本地文件來指定要被包含的文件。如果目標服務器將目標文件作為 PHP 代碼解釋,則可以用適用於 HTTP GET 的 URL 請求字符串來向被包括的文件傳遞變量。嚴格的說這和包含一個文件並繼承父文件的變量空間並不是一回事;該腳本文件實際上已經在遠程服務器上運行了,而本地腳本則包括了其結果。
include處理返回值
處理返回值:可以在被包括的文件中使用 return 語句來終止該文件中程序的執行並返回調用它的腳本。同樣也可以從被包含的文件中返回值。可以像普通函數一樣獲得 include 調用的返回值。不過這在包含遠程文件時卻不行,除非遠程文件的輸出具有合法的 PHP 開始和結束標記(如同任何本地文件一樣)。可以在標記內定義所需的變量,該變量在文件被包含的位置之後就可用了。
因為 include 是一個特殊的語言結構,其參數不需要括號。在比較其返回值時要注意。
如果文件不能被包含,則返回 FALSE 並發出一個 E_WARNING 警告。
如果在包含文件中定義有函數,這些函數可以獨立於是否在 return 之前還是之後在主文件中使用。如果文件被包含兩次,PHP 5 發出致命錯誤因為函數已經被定義,但是 PHP 在 return 之後不會抱怨函數已定義。推薦使用 include_once 而不是檢查文件是否已包含並在包含文件中有條件返回。
另一個將 PHP 文件“包含”到一個變量中的方法是用輸出控制函數結合 include 來捕獲其輸出。