轉自:http://blog.sina.com.cn/s/blog_5d2673da0100cp6o.html
require(),include(),require_once()和include_once()的異同
require()和include()有許多相似之處,也有些不同。理解它們的不同點非常重要,否則很容易犯錯誤。
我把這兩個語句放在一起介紹,讀者可以比較學習。
1.require()語句
比如:require()所包含的文件中不能包含控制結構,而且不能使用return這樣的語句。在require()所包含的文件中使用return語句會產生處理錯誤。
require("
require("file.php?varfirst=1&varsecond=2");
require("http://some_server/file.php?varfirst=1&varsecond=2");
$varfirst=1;
$varsecond=2;
require("file.txt");
require("file.php");
2.include()語句
<?php
$files=array('first.php','second.php','third.php');
}
?>
php3.0中通常會報告錯誤。以下舉例說明:
test.inc
<?php
echo "Before the return<br>\n";
if(1)
{
}
echo "After the return<br>\n";
?>
假設在main.php文件中包含下面的語句:
<?php
$retval=include('test.inc');
echo "File returned:'$retval'<br>\n";
?>
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
?>
和fool.inc:
<?php
?>
然後在error_require.php中包含這兩個文件:
<?php
require("fool.inc");
require("util.inc");//此句會產生一個錯誤
$foo=array("1",array("complex","quaternion"));
echo "required in fool.inc\n";
echo "Running goodTea:".goodTea()."<br>\n";
echo "Printing foo:<br>\n";
showVar($foo);
?>
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)的行爲
可能不是所期望的。
例子:
<?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;
}
?>