PHP 你真的瞭解INCLUDE、REQUIRE嗎?

在PHP中有兩個引入文件的語言結構:include、require

1、注意這兩個都是語言結構不是方法,與echo、print、isset()、empty()、unset()等類似都是語言結構不是函數!!!!!

2、include與require都是引入外部文件到當前上下文環境,但是他們有一些區別:

一、被包含文件先按參數給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path 指定的目錄尋找。如果在 include_path 下沒找到該文件則 include 最後才在調用腳本文件所在的目錄和當前工作目錄下尋找。如果最後仍未找到文件則 include 結構會發出一條警告;這一點和 require 不同,後者會發出一個致命錯誤。(在這點上include_once與require_once類似,但是他們在導入一個已導入的文件都會忽略,但是他們在引入文件時會判斷是否引入會降低性能)

二、關於引入的文件:當一個文件被包含時,其中所包含的代碼繼承了 include、require 所在行的變量範圍。從該處開始,調用文件在該行處可用的任何變量在被調用的文件中也都可用。不過所有在包含文件中定義的函數和類都具有全局作用域。

EG1:

vars.php

$color = 'green';

$fruit = 'apple';

?>

test.php

echo "A $color $fruit"; // A

include 'vars.php';

echo "A $color $fruit"; // A green apple

?>

如果 include 出現於調用文件中的一個函數里,則被調用的文件中所包含的所有代碼將表現得如同它們是在該函數內部定義的一樣。所以它將遵循該函數的變量範圍。此規則的一個例外是魔術常量,它們是在發生包含之前就已被解析器處理的。

3、include返回值:

處理返回值:在失敗時 include 返回 FALSE 並且發出警告。成功的包含則返回 1,除非在包含文件中另外給出了返回值。可以在被包括的文件中使用 return 語句來終止該文件中程序的執行並返回調用它的腳本。同樣也可以從被包含的文件中返回值。可以像普通函數一樣獲得 include 調用的返回值。不過這在包含遠程文件時卻不行,除非遠程文件的輸出具有合法的 PHP 開始和結束標記(如同任何本地文件一樣)。可以在標記內定義所需的變量,該變量在文件被包含的位置之後就可用了。因為 include 是一個特殊的語言結構,其參數不需要括號。在比較其返回值時要注意。

EG2:

// won't work, evaluated as include(('vars.php') == TRUE), i.e. include('')

if (include('vars.php') == TRUE) {

echo 'OK';

}

// works

if ((include 'vars.php') == TRUE) {

echo 'OK';

}

講解:

$bar 的值為 1 是因為 include 成功運行了。注意以上例子中的區別。第一個在被包含的文件中用了 return 而另一個沒有。如果文件不能被包含,則返回 FALSE 併發出一個 E_WARNING 警告。如果在包含文件中定義有函數,這些函數不管是在 return 之前還是之後定義的,都可以獨立在主文件中使用。如果文件被包含兩次,PHP 5 發出致命錯誤因為函數已經被定義,但是 PHP 4 不會對在 return 之後定義的函數報錯。推薦用 include_once 而不是檢查文件是否已包含並在包含文件中有條件返回.

3、include引入文件的處理:(這點很重要)

當一個文件被包含時,語法解析器在目標文件的開頭脫離 PHP 模式並進入 HTML 模式,到文件結尾處恢復。由於此原因,目標文件中需要作為 PHP 代碼執行的任何代碼都必須被包括在有效的 PHP 起始和結束標記之中。並且當執行完成之後直接加入到緩衝區,將被導入的文件中的變量加入到當前的作用域變量鏈上。

EG3:

//t1.php 文件內容

123456789

//t2.php文件內容

include "t1.php";

echo $name;

//開始執行t2.php

會輸出:12345678PQS

案例解析:

首先當include "t1.php";文件時PHP解析器脫離PHP模式進入HTML模式開始解析,因為HTML模式是將內容直接加入到緩衝區,所以沒有標籤1234會被首先加入到緩衝區,然後在執行這裡就會把$name這個變量加入到t2.php的include "t1.php"這句代碼的上線文變量作用域中。然後接著在回到HTM模式將5678加入到緩衝區,接下來遇到就開始進入PHP模式進行執行代碼,因為include是接受return的,所以當這裡return 1之後整個文件的加載就到此處結束了, 返回到t2的代碼執行域中了,這也是為什麼最後沒有輸出9的原因。

舉個例子證明PHP將文件輸入到緩衝區:

//t3.php

1234567

//t4.php

$string = get_include_contents('t3.php');

function get_include_contents($filename) {

if (is_file($filename)) {

ob_start();

include $filename;

$contents = ob_get_contents();

ob_end_clean();

return $contents;

}

return false;

}

echo $string;

//執行t4.php

1234567

案例分析:

函數get_include_contents($filename)

在include之前開啟緩衝區,當include將t3.php文件引入後就使用ob_get_contents()方法獲取緩衝區數據賦值給$contents,然後使用ob_end_clean將緩衝區數據丟棄最後將$contents返回,最後輸出返回值就是t3.php在經過php運行的值。

4、include支持引入URL:

如果“URL include wrappers”在 PHP 中被激活,可以用 URL(通過 HTTP 或者其它支持的封裝協議——見支持的協議和封裝協議)而不是本地文件來指定要被包含的文件。如果目標服務器將目標文件作為 PHP 代碼解釋,則可以用適用於 HTTP GET 的 URL 請求字符串來向被包括的文件傳遞變量。嚴格的說這和包含一個文件並繼承父文件的變量空間並不是一回事;該腳本文件實際上已經在遠程服務器上運行了,而本地腳本則包括了其結果。

/* This example assumes that www.example.com is configured to parse .php *

* files and not .txt files. Also, 'Works' here means that the variables *

* $foo and $bar are available within the included file. */

// Won't work; file.txt wasn't handled by www.example.com as PHP

include 'http://www.example.com/file.txt?foo=1&bar=2';

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the

// local filesystem.

include 'file.php?foo=1&bar=2';

// Works.

include 'http://www.example.com/file.php?foo=1&bar=2';

$foo = 1;

$bar = 2;

include 'file.txt'; // Works.

include 'file.php'; // Works.

此案例是PHP官網案例,如果不懂之處請移步值PHP官網include章節!


分享到:


相關文章: