首頁 >後端開發 >php教程 >要求、包括、require_once 和 include_once 區別

要求、包括、require_once 和 include_once 區別

WBOY
WBOY原創
2016-08-08 09:21:53959瀏覽

1.require()語句 
require()語句用來指定的檔案取代語句本身,就像C語言中的include()語句一樣。如果php設定檔php.ini中的URL fopen wrappers 是開啟的(預設是開啟的),就可以使用URL來指定檔案的位置從而實現遠端檔案的呼叫。 
有一點就是使用require()和include()語句時要特別的注意。那就是在被包含的檔案中,處理器是按照html模式來解釋其中的內容的,處理完被包含的內容後又恢復到php模式。所以如果需要在被包含檔案中使用php語法,就要使用正確的php開始和結束標記來把這些語句包含進去。 
require()和include()知識php中的一種語言特性,而不是函數。它們和函數有許多不同的地方。 
例如:require()所包含的檔案中不能包含控制結構,而且不能使用return這樣的語句。在require()所包含的檔案中使用return語句會產生處理錯誤。 
不像include()語句,require()語句會無條件地讀取它所包含的檔案的內容,而不管這些語句是否執行。所以如果你想依照不同的條件包含不同的文件,就必須使用include()語句。當然,如果require()所在位置的語句不會執行,require()所包含的檔案中的語句也不會被執行。 
require()不能在迴圈體中依條件的不同而包含不同的檔案。 require()語句只會在第一次執行時呼叫它所包含的檔案中的內容替換本身這條語句,當再次被執行時只能執行第一次所包含的語句。但是include()語句可以在迴圈體中來包含不同的檔案。 
require()語句中的變數繼承require()語句所在位置的變數作用域。所有在require()語句的位置可以存取的變量,在require()語句所包含的檔案中都可以存取。如果require()語句位於一個函數內部,那麼被包含檔案內的語句都相當於定義在函數內部。 
require()語句在PHP程式執行前就會將使用require引用的檔案讀入,因此require通常放到程式的開始處。因此要特別注意一點,require語句有一點強,不管程式是否真的需要引用的文件,只要你使用require語句,它都會把他們包含進來!即使你是在條件控制語句中使用這個函數進行包含,那怕是那個條件不為真,引用文件也會被包含進來!形成了殭屍,在運行過程中這些殭屍是不起任何可見作用的,但是很明顯它會加重負擔,所以這一點要特別注意!如果使用require語句發生了包含錯誤,那麼程式將輸出出錯訊息並停止運作! ! 
如果require()語句透過宣告文件的URL來包含遠端文件,而且遠端伺服器依照php程式碼來解釋該文件的話,本地php檔案所包含的內容是在遠端伺服器上處理以後的結果。例如: 

複製程式碼程式碼如下:


/* 
這個範例假設some_server伺服器可以解釋.php檔案,而不對.txt檔案進行解釋。在遠端檔案中 
需要變數$varfirst和$varsecond 
*/ 
/*無法正確執行,遠端伺服器不處理.txt檔案*/ 
require("http://some_server/file.txt?varfirst=1&varsec>
require("http://some_server/file.txt?varfirst=1&varsec>
require("http://some_server/file.txt?varfirst=1&varsec>
require("http://some_server/file.txt?varfirst=1&varsec>
require("http://some_server/file.txt?varfirst=1&varsec>
require /*不正確,這樣只能在本機上尋找file.php檔案*/ 
require("file.php?varfirst=1&varsec>
/*正確的語句*/ 
require("http://some_server/file. php?varfirst=1&varsec>

$varfirst=1; 
$varsec>require("file.txt"); /*正確的語句*/ require("file.php"); /*正確的語句*/ require("file.php"); /*正確的語句*/ 

本來在php3.0中,require()所包含的檔案可以使用return語句,但條件是return語句不能出現在{}內部,而必須出現在被包含檔案的全域範圍內。中已經取消了require()的這個功能,但是仍然可以使用include()來實現。上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。 。繼續執行!檔案。


$files=array('first.php','second.php','third.php'); 
for($i=0;$i
include $files[$i]; 

?> 


在php3.0和php4.0中include()語句停止所包含的檔案中都可以使用一個值,return語句來傳回一個值,並且語句停止所包含的檔案中都可以使用一個值,return語句來傳回一個值,並且語句停止所包含的檔案中都可以使用一個值,並在return語句執行被包含文件下面的內容。但php3.0和php4.0在處理這樣的情況時有所不同。在php3.0中return語句不能包含在{}內,除非它在一個函數中,因為這時它表示函數的回傳值而不是檔案的回傳值。而在php4.0中就沒有了這樣的限制,使用者甚至可以在檔案中傳回一個數字,就像函數的回傳值一樣。這樣的語句在 
php3.0通常會報告錯誤。以下舉例說明: 
假設被包含的檔案為test.inc和主檔案main.php位於一個目錄中。 test.inc的內容如下: 
test.inc 

複製程式碼程式碼如下:


echo
return 27; 

echo "After the return
n"; 
?> 


假設在main.php
$retval=include('test.inc'); 
echo "File returned:'$retval'
n"; 

?> php3.005行報告錯誤,而不能得到include()語句的回傳值。但在php4.0會得到下面的結果: 


Before the return 


File returned: '27' 


下邊假設main.php改為: 
include('test.inc'); 
echo "Back in main.html
n"; ?> 
: Before the return 

Back in main.html 在php5.0中的輸出結果也是: 

Before the return 



Before the return 


27Back in main.html 
Parse error:parse error in /apache/hts/phptestParse error:parse error in /apache/hts/phptest/ }內部而且不是一個函數內部。如果把{}拿掉,讓它位於test.inc的最外層,輸出結果是: 
Before the return 
27Back in main.html 
之所以出現27,是因為在php3.0不支援include()返回。 
3.require_once()和include_once()語句 
require_once()和include_once()語句分別對應於require()和include()語句。 require_once()和include_once()語句主要用於需要包含多個檔案時,可以有效地避免把同一段程式碼包含進去而出現函數或變數重複定義的錯誤。例如:如果建立兩個檔案util.inc和fool.inc,程式碼分別為: 
util.inc: 

複製程式碼程式碼floor(phpversion())); 
echo "GLOBALS ARE NICE
n"; function goodTea() 
return "Olong tea tasts good!"; : 
複製程式碼
程式碼如下:
require ("util.inc"); r ($var); else 
var_dump($var); 
?> 

程式碼如下:

require("fool.inc"); 
require("util.inc");//此句會產生一個錯誤 
$foo=array("1",array("complex ","quaternion")); 
echo "this is requiring util.inc again which is also
n"; 
echo "required in fool.incn"; 
echo "Running goodTea:".goodTea()."
n"; 
echo "Printing foo:
n"; 
showVar($foo); 
?> 

當運行error_require.php時,輸出結果如下: 
當運行error_require.php時,輸出結果如下: 當運行error_require.php時,輸出結果如下: 
GLOBALS ARE NICE 
GLOBALS ARE NICE 
Fat al 如果使用require_once( )語句來代替require()語句,就不會出現上面的錯誤。我們將error_require.php和fool.inc中的require()語句改為require_once()語句並重新命名為error_require_once.php,這是顯示結果如下: 
GLOBALS ARE NICE 

GLOBALS ARE NICE  which is also 
required in fool.inc Running goodTea:Olong tea tastes good! 
Printing foo: 
=Array([0] = 1 [1] 1] = quaternion)) 
include_once()語句的語法和include()語句類似,主要差異也是避免多次包含一個檔案而引起函數或變數的重複定義。 
require_once語句有一個引用鏈,它可以保證檔案加入你的程式只有一次,而且會避開變數值和函數名稱之間的衝突。 
和require_once語句一樣,include_once語句把include的功能擴展了。在程式執行期間​​,將指定的檔案包含進來,如果從檔案引用進來的程式先前已經包含過的時候,include_once()就不會再包含它進來。也就是僅僅可以引用同一個文件一次! 
include_once() 語句在腳本執行期間包含並執行指定檔案。此行為和 include() 語句類似,唯一差異是如果該檔案中的程式碼已經被包含了,則不會再次包含。如同此語句名字暗示的那樣,只會包含一次。 
include_once() 應該用於在腳本執行期間同一個檔案有可能被包含超過一次的情況下,想確保它只被包含一次以避免函數重定義,變數重新賦值等問題。 
使用 require_once() 和 include_once() 的更多範例請參閱最新的 PHP 原始程式發行套件中的 PEAR 程式碼。 
回傳值和 include() 相同。如果檔案已包含,本函數傳回 TRUE。 
附註: include_once() 是 PHP 4.0.1pl2 中新加入的。 
註: 要注意 include_once() 和 require_once() 在大小寫不敏感的作業系統中(例如 Windows)的行為 
可能不是所期望的。

範例: include_once() 在Windows 下方不區分大小寫 

複製程式碼

程式碼如下:


php 

include_once("A.php"); // this will include a.php again on Windows! (PHP 4 only) 
?> 
此行為在PHP 5 中改了,路徑先被規格化,因此C:PROGRA~1A.php 和C:Program Filesa.php 的實作一樣,檔案只會被包含一次。 
如果要包含的檔案不存在,include提示notice,然後繼續執行下面的語句,require提示致命錯誤並且退出。 
  win32平台下它們都是先包含後執行,所以被包含文件裡最好不要再有include或require語句,這樣會造成目錄混亂。或許Linux下情況不同,暫時還沒測試。 

  如果一個檔案不想被包含多次可以使用include_once或require_once## 讀取,可以寫入文件資料。

複製程式碼


程式碼如下:


function r($file_name) { 
 『 ; 
 $file_data=@fread($filenum,filesize($file_name)); 
 @fclose($filenum); 
 return $file_data; 
} { 
 $filenum=@fopen($file_name,$method); 
 flock($filenum,LOCK_EX); 
 $file_data=fwrite($filenum,$file:); } 

以上就介紹了require,include,require_once和include_once區別,包括了方面的內容,希望對PHP教程有興趣的朋友有所幫助。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn