1. 程式人生 > >深入理解require與require_once與include以及include_once的區別

深入理解require與require_once與include以及include_once的區別

PHP具有快速、可靠、跨平臺應用、原始碼開放等特點,使得PHP成為最受歡迎的伺服器端Script語言之一。我根據自己在工作中體會到的,向大家介紹PHP使用的心得,希望對大家有所幫助。 

利用PHP的Include files維護你的網站 
不管你所開發的網站的規模是大是小,你都應該要認識到重複使用程式程式碼的重要性,不論你重複使用的是 PHP 程式或者是 HTML 原始碼。舉個例子來說,網站頁尾的版權宣告至少每年都得修改一次,如果你的網站有許多個頁面,該怎麼辦呢?動手一個一個修改這些頁面肯定是一件頭痛的事情。通過 PHP 我們可以用幾個不同的方式來重複使用程式程式碼。要使用哪些函式端視你要重複使用的是怎樣的內容而定。 

這些主要的函式包括: 
* include() 與 include_once() 
* require() 與 require_once() 


1.include() 函式會將指定的檔案讀入並且執行裡面的程式。 
例如:include('/home/me/myfile'); 
被匯入的檔案中的程式程式碼都會被執行,而且這些程式在執行的時候會擁有和原始檔中呼叫到 include() 函式的位置相同的變數範圍(variable scope)。你可以匯入同一個伺服器中的靜態檔案,甚至可以通過合併使用 include() 與 fopen() 函式來匯入其它伺服器上面的檔案。

2.include_once()函式的作用和 include() 是幾乎相同的 
唯一的差別在於 include_once() 函式會先檢查要匯入的檔案是不是已經在該程式中的其它地方被匯入過了,如果有的話就不會再次重複匯入該檔案(這項功能有時候是很重要的,比方說要匯入的檔案裡面宣告了一些你自行定義好的函式,那麼如果在同一個程式重複匯入這個檔案,在第二次匯入的時候便會發生錯誤訊息,因為 PHP 不允許相同名稱的函式被重複宣告第二次)。

3.require()函式會將目標檔案的內容讀入,並且把自己本身代換成這些讀入的內容。 
這個讀入並且代換的動作是在 PHP 引擎編譯你的程式程式碼的時候發生的,而不是發生在 PHP 引擎開始執行編譯好的程式程式碼的時候(PHP 3.0 引擎的工作方式是編譯一行執行一行,但是到了 PHP 4.0 就有所改變了,PHP 4.0 是先把整個程式程式碼全部編譯完成後,再將這些編譯好的程式程式碼一次執行完畢,在編譯的過程中不會執行任何程式程式碼)。require() 通常來匯入靜態的內容,而 include() 則適合用來匯入動態的程式程式碼。

4.如同 include_once()函式,require_once() 函式會先檢查目標檔案的內容是不是在之前就已經匯入過了,如果是的話,便不會再次重複匯入同樣的內容。 
我個人習慣使用 require() 函式來匯入版權宣告(copyrights),靜態文字或其它本身不含有變數,或者本身需要倚賴其它執行過的程式才能正確執行的程式程式碼。例如: 

複製程式碼程式碼如下:
<HTML>
<HEAD><TITLE>網頁標題</TITLE></HEAD>
<BODY>
[一堆內容]
<?
// 匯入版權宣告文字
require('/home/me/mycopyright');
?>
</BODY>
</HTML>

另一方面,我通常在程式的開頭使用 include() 函式來匯入一些函式庫或者類似的程式程式碼: 
複製程式碼程式碼如下:
<?
// 匯入我的函式庫
include('/home/me/myfunctions'); 
// 利用之前匯入的函式庫裡面定義好的 PHP 函式執行一些功能
?>
<HTML>
<HEAD><TITLE>網頁標題</TITLE></HEAD>
<BODY>
[一堆內容]
</BODY>
</HTML> 

接下來你可能會問這第一個挺符合邏輯的問題:「這些被匯入的檔案要放在哪兒呢?」簡短的答案是:「放在伺服器檔案系統裡的任何地方都行。」然而,要留意的是如果被匯入的檔案除了單純的程式程式碼片段以外還包含了一些敏感資料,例如連結資料庫系統要用到的帳號和密碼,那麼建議你不要把這些檔案放在 Web 伺服器的檔案根目錄之下,因為那樣的話他人便可以很容易地竊取到這些資料了。

你可以將這些被包含的檔案放在系統的任何一個目錄裡面,唯一的條件是 PHP 本身用來執行的身分(www,nobody 或者其它身分)必須要有足夠的許可權能夠讀取這些檔案就可以了。這些檔案的副檔名也可以任意取,甚至沒有附檔名也無所謂。

善用include()和 require()來將網站裡面經常需要變動的共享內容做合理的分割,在更新網站內容的時候將會容易進行得多。

利用PHP來維護檔案系統 
PHP 提供了很多與檔案系統相關的函式,讓我們不僅可以開啟檔案,還能夠顯示目錄的內容,搬移檔案的位置以及其它更多功能。有的朋友甚至寫了能夠通過瀏覽器來管理檔案內容的 PHP 程式。

在開始介紹 PHP 的檔案系統相關功能之前,我們要先理清一件事情:在 Windows作業系統裡面,檔案路徑可以使用斜線(/)或者反斜線(\)來表示,但是在其它作業系統裡面我們只會使用到斜線。為了保持統一性,下面的例子裡面的檔案路徑都是使用斜線。

下面的例子程式我將教大家基本的目錄內容顯示功能,每個步驟都有批註,請直接閱讀。 

複製程式碼程式碼如下:
<? /* $dir_name 這個變數的值是你想要讀取的目錄的完整路徑 */ 
$dir_name = "/home/me/"; 
/* opendir()函式會開啟某個目錄,並且傳回一個參考值(handle)讓我們可以用來在程式中參照到該目錄 */ 
$dir = opendir($dir_name); 
/* 開始建立一個字串,這個字串包含了 HTML 的列表卷標,用來顯示目錄中的檔名稱。 */ 
$file_list = "<ul>"; 
/* 使用一個 while 迴圈敘述將前面開啟的目錄中的檔案全部讀取一遍。如果讀取到的檔名不是「.」或者「..」,就把該檔名寫入前面提到的字串裡面去。 */ 
while ($file_name = readdir($dir)) { 
if (($file_name != ".") && ($file_name != "..")) { 
$file_list .= "<li>$file_name"; 


/* 替 HTML 列表卷標加上結尾 */ 
$file_list .= "</ul>"; 
/* 關閉之前開啟的目錄並且結束這段 PHP 程式 */ 
closedir($dir); 
?> 
<!-- HTML原始碼從這裡開始 -->
<HTML>
<HEAD>

</HEAD>
<BODY>
<!-- 使用 PHP 程式來將我們所讀取的目錄名稱顯示在頁面上 -->
<P>Files in: <? echo "$dir_name"; ?></p>
<!-- 使用 PHP 程式將該目錄中讀取到的檔名顯示在頁面上 -->
<? echo "$file_list"; ?>
</BODY>
</HTML>


經過上面幾步,你已經成功把某個目錄中的檔名稱顯示在網頁上了。但你要記住一點:要讀取某個目錄或者檔案(讀取檔案內容的做法稍後會介紹),PHP 本身執行所用的身分必須至少擁有該目錄或者檔案的讀取許可權才行,否則系統會顯示許可權不足的錯誤訊息。

下一個例子我將教大家如何複製一個檔案: 

複製程式碼程式碼如下:
<? /* 變數$orginal儲存原始檔的完整路徑,變數$copied儲存複製過去的新檔案的完整路徑 */ 
$original = "/home/me/mydatabasedump";
$copied = "/archive/mydatabasedumo_1010"; 
/* 呼叫 copy() 函式把檔案從原始位置複製一份到新的位置去。如果無法複製,那麼便終止程式的執行並且顯示錯誤訊息。 */
@copy($original, $copied) or die("無法複製檔案。"); 
?> 

上面的例子程式可以用來擴充成為一個檔案備份系統程式。當這個程式執行的時候,它會將資料庫的資料檔案複製到其它目錄下面做為備份之用。只要修改系統的排程檔案內容(crontab),我們便可以讓這個程式自動在每天的固定時間執行一次,達到系統自動備份,不需要人工手動執行。

如果你的系統上面有安裝 Lynx 軟體(Lynx 是一種純文字的 Web 瀏覽器)的話,你可以在系統排程檔案裡面加入下面這筆記錄來讓系統在固定時間自動啟用 Lynx 並且呼叫我們之前寫好的 PHP 備份程式。當 Lynx 呼叫(瀏覽)我們的 PHP 程式的時候,該程式就會被執行,並且產生備份檔案。下面這個例子教你如何在每天早晨五點鐘執行我們的備份程式,並且在執行完以後自動將 Lynx 程式關閉: 
0 5 * * * [username] lynx -dump http://localhost/copyfile.php 1>/dev/null 2>&1 
如果你的系統安裝的是 CGI 版本的 PHP,那麼你可以直接呼叫 PHP 執行檔而不需要通過 Lynx 來呼叫我們的 PHP 程式 
php中include和require有什麼區別
平常是沒區別的.
當要載入的檔案不存在時候, include會給一個warning警告, 然後繼續執行. 而require則會給一個fatal error, 直接結束指令碼
=====================================================
php手冊裡面是這樣說的:
require() 和 include() 除了怎樣處理失敗之外在各方面都完全一樣。include() 產生一個警告而 require() 則導致一個致命錯誤。換句話說,如果想在丟失檔案時停止處理頁面,那就別猶豫了,用 require() 吧。include() 就不是這樣,指令碼會繼續執行。