程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> 深入理解require與require_once與include以及include_once的區別

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

編輯:PHP綜合

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() 就不是這樣,腳本會繼續運行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved