require(),include(),require_once()和include_once()的異同javascript
require()和include()有許多類似之處,也有些不一樣。理解它們的不一樣點很是重要,不然很容易犯錯誤。php
我把這兩個語句放在一塊兒介紹,讀者能夠比較學習。 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語句發生了包含錯誤,那麼程序將輸出出錯信息並中止運行!!html
若是require()語句經過聲明文件的URL來包含遠程文件,並且遠程服務器按照php代碼來解釋該文件的話,本地php文件中所包含的內容是在遠程服務器上處理之後的結果。例如:
require("http://some_server/file.txt?varfirst=1&varsecond=2");java
require("file.php?varfirst=1&varsecond=2");apache
require("http://some_server/file.php?varfirst=1&varsecond=2");服務器
$varfirst=1; $varsecond=2; require("file.txt"); require("file.php"); 原本在php3.0中,require()所包含的文件可使用return語句,但條件是return語句不能出如今{}內部,而必須出如今被包含文件的全局範圍內。在php4.0中已經取消了require()的這個功能,可是仍然可使用include()來實現。app
2.include()語句 include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include() 的部分外,require()語句的功能徹底適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特色。 include語句只有在被執行時纔會讀入要包含的文件。在錯誤處理方便,使用include語句,若是發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息可是程序仍是會繼續執行! php處理器會在每次遇到include()語句時,對它進行從新處理,因此能夠根據不一樣狀況的,在條件控制語句和循環語句中使用include()來包含不一樣的文件。 例如: <?php $files=array('first.php','second.php','third.php'); for($i=0;$i<count($files);$i++) { include $files[$i]; } ?> 在php3.0和php4.0中include()語句所包含的文件中均可以使用return語句來返回一個值,並中止執行被包含文件下面的內容。但 php3.0和php4.0在處理這樣的狀況時有所不一樣。在php3.0中return語句不能包含在{}內,除非它在一個函數中,由於這時它表示函數的返回值而不是文件的返回值。而在php4.0中就沒有了這樣的限制,用戶甚至能夠在文件中返回一個數字,就象函數的返回值同樣。這樣的語句在函數
php3.0中一般會報告錯誤。如下舉例說明: 假設被包含的文件爲test.inc和主文件main.php位於一個目錄中。test.inc的內容以下: test.inc <?php echo "Before the return<br>\n"; if(1) { return 27; } echo "After the return<br>\n"; ?>學習
假設在main.php文件中包含下面的語句: <?php $retval=include('test.inc'); echo "File returned:'$retval'<br>\n"; ?> php3.0解釋器會在第二行報告錯誤,而不能獲得include()語句的返回值。但在php4.0中會獲得下面的結果: Before the return File returned: '27' 下邊假設main.php改成: <?php include('test.inc'); echo "Back in main.html<br>\n"; ?> 在php4.0中的輸出結果是: Before the return Back in main.html測試
在php5.0中的輸出結果也是: Before the return Back in main.html
在php3.0中的輸出結果是: Before the return 27Back in main.html
Parse error:parse error in /apache/htdocs/phptest/main.html on line 5
出現上面的錯誤是由於return語句位於{}內部並且不是一個函數內部。若是把{}去掉,使它位於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: <?php define(PHPVERSION,floor(phpversion())); echo "GLOBALS ARE NICE<br>\n"; function goodTea() { return "Olong tea tasts good!"; } ?> 和fool.inc: <?php require ("util.inc"); function showVar($var) { if(PHPVERSION==4) { print_r($var); } else { var_dump($var); } } ?> 而後在error_require.php中包含這兩個文件: <?php require("fool.inc"); require("util.inc");//此句會產生一個錯誤 $foo=array("1",array("complex","quaternion")); echo "this is requiring util.inc again which is also<br>\n"; echo "required in fool.inc\n"; echo "Running goodTea:".goodTea()."<br>\n"; echo "Printing foo:<br>\n"; showVar($foo); ?> 當運行error_require.php時,輸出結果以下: GLOBALS ARE NICE GLOBALS ARE NICE
Fatal error:Cannot redeclare goodTea() in util.inc on line 4 若是使用require_once()語句來代替 require()語句,就不會出現上面的錯誤。咱們把error_require.php和fool.inc中的require()語句改成 require_once()語句並重命名爲error_require_once.php,這是顯示結果以下: GLOBALS ARE NICE this is requiring util.inc again which is also required in fool.inc Running goodTea:Olong tea tastes good! Printing foo: Array([0] => 1 [1] => Array ([0] => complex [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 include_once("A.php"); // this will include a.php again on Windows! (PHP 4 only) ?>
此行爲在 PHP 5 中改了,路徑先被規格化,所以 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的實現同樣,文件只會被包含一次。
若是要包含的文件不存在,include提示notice,而後繼續執行下面的語句,require提示致命錯誤而且退出。
win32平臺下它們都是先包含後執行,因此被包含文件裏最好不要再有include或require語句,這樣會形成目錄混亂。或許Linux下狀況不一樣,暫時還沒測試。
若是一個文件不想被包含屢次可使用include_once或require_once## 讀取,能夠寫入文檔數據。 <?php function r($file_name) { $filenum=@fopen($file_name,"r"); @flock($filenum,LOCK_SH); $file_data=@fread($filenum,filesize($file_name)); @fclose($filenum); return $file_data; } function w($file_name,$data,$method="w"){ $filenum=@fopen($file_name,$method); flock($filenum,LOCK_EX); $file_data=fwrite($filenum,$data); fclose($filenum); return $file_data; } ?>