最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

require(),include(),require_once()和include_once()區(qū)別

 更新時(shí)間:2008年03月27日 23:02:34   作者:  
面試中最容易提到的一個(gè)PHP的問(wèn)題,我想和大家共勉一下: require()和include()有許多相似之處,也有些不同。理解它們的不同點(diǎn)非常重要,否則很容易犯錯(cuò)誤。

我把這兩個(gè)語(yǔ)句放在一起介紹,讀者可以比較學(xué)習(xí)。
1.require()語(yǔ)句
require()語(yǔ)句用于指定的文件代替語(yǔ)句本身,就象C語(yǔ)言中的include()語(yǔ)句一樣。如果php配置文件php.ini中的URL fopen wrappers 是打開(kāi)的(默認(rèn)情況下是打開(kāi)的),就可以使用URL來(lái)指定文件的位置從而實(shí)現(xiàn)遠(yuǎn)程文件的調(diào)用。
有一點(diǎn)就是使用require()和include()語(yǔ)句時(shí)要特別的注意。那就是在被包含的文件中,處理器是按照html模式來(lái)解釋其中的內(nèi)容的,處理完被包含的內(nèi)容后又恢復(fù)到php模式。所以如果需要在被包含文件中使用php語(yǔ)法,就要使用正確的php開(kāi)始和結(jié)束標(biāo)記來(lái)把這些語(yǔ)句包含進(jìn)去。
require()和include()知識(shí)php中的一種語(yǔ)言特性,而不是函數(shù)。它們和函數(shù)有許多不同的地方。
比如:require()所包含的文件中不能包含控制結(jié)構(gòu),而且不能使用return這樣的語(yǔ)句。在require()所包含的文件中使用return語(yǔ)句會(huì)產(chǎn)生處理錯(cuò)誤。
不象include()語(yǔ)句,require()語(yǔ)句會(huì)無(wú)條件地讀取它所包含的文件的內(nèi)容,而不管這些語(yǔ)句是否執(zhí)行。所以如果你想按照不同的條件包含不同的文件,就必須使用include()語(yǔ)句。當(dāng)然,如果require()所在位置的語(yǔ)句不被執(zhí)行,require()所包含的文件中的語(yǔ)句也不會(huì)被執(zhí)行。
require()不能在循環(huán)體中根據(jù)條件的不同而包含不同的文件。require()語(yǔ)句只會(huì)在第一次執(zhí)行時(shí)調(diào)用它所包含的文件中的內(nèi)容替換本身這條語(yǔ)句,當(dāng)再次被執(zhí)行時(shí)只能執(zhí)行第一次所包含的語(yǔ)句。但是include()語(yǔ)句可以在循環(huán)體中來(lái)包含不同的文件。
require()語(yǔ)句中的變量繼承require()語(yǔ)句所在位置的變量作用域。所有在require()語(yǔ)句的位置可以訪問(wèn)的變量,在require()語(yǔ)句所包含的文件中都可以訪問(wèn)。如果require()語(yǔ)句位于一個(gè)函數(shù)內(nèi)部,那么被包含文件內(nèi)的語(yǔ)句都相當(dāng)于定義在函數(shù)內(nèi)部。
require()語(yǔ)句在PHP程序執(zhí)行前就會(huì)將使用require引用的文件讀入,因此require通常放到程序的開(kāi)始處。因此要特別注意一點(diǎn),require語(yǔ)句有一點(diǎn)強(qiáng),不管程序是否真的需要引用的文件,只要你使用require語(yǔ)句,它都會(huì)把他們包含進(jìn)來(lái)!即使你是在條件控制語(yǔ)句中使用這個(gè)函數(shù)進(jìn)行包含,那怕是那個(gè)條件不為真,引用文件也會(huì)被包含進(jìn)來(lái)!形成了僵尸,在運(yùn)行過(guò)程中這些僵尸是不起任何可見(jiàn)作用的,但是很明顯它會(huì)加重負(fù)擔(dān),所以這一點(diǎn)要特別注意!如果使用require語(yǔ)句發(fā)生了包含錯(cuò)誤,那么程序?qū)⑤敵龀鲥e(cuò)信息并停止運(yùn)行??!

如果require()語(yǔ)句通過(guò)聲明文件的URL來(lái)包含遠(yuǎn)程文件,而且遠(yuǎn)程服務(wù)器按照php代碼來(lái)解釋該文件的話,本地php文件中所包含的內(nèi)容是在遠(yuǎn)程服務(wù)器上處理以后的結(jié)果。例如:

復(fù)制代碼 代碼如下:

/*
這個(gè)例子假設(shè)some_server服務(wù)器可以解釋.php文件,而不對(duì).txt文件進(jìn)行解釋。在遠(yuǎn)程文件中
需要變量$varfirst和$varsecond
*/
/*不能正確執(zhí)行,遠(yuǎn)程服務(wù)器不處理.txt文件*/
require("http://some_server/file.txt?varfirst=1&varsecond=2");

/*不正確,這樣只能在本地機(jī)上尋找file.php文件*/
require("file.php?varfirst=1&varsecond=2");

/*正確的語(yǔ)句*/
require("http://some_server/file.php?varfirst=1&varsecond=2");

$varfirst=1;
$varsecond=2;
require("file.txt"); /*正確的語(yǔ)句*/
require("file.php"); /*正確的語(yǔ)句*/

本來(lái)在php3.0中,require()所包含的文件可以使用return語(yǔ)句,但條件是return語(yǔ)句不能出現(xiàn)在{}內(nèi)部,而必須出現(xiàn)在被包含文件的全局范圍內(nèi)。在php4.0中已經(jīng)取消了require()的這個(gè)功能,但是仍然可以使用include()來(lái)實(shí)現(xiàn)。

2.include()語(yǔ)句
include()語(yǔ)句和require()語(yǔ)句有許多相同的地方。凡是在上邊require()語(yǔ)句中沒(méi)有明確說(shuō)明不能適用于include()的部分外,require()語(yǔ)句的功能完全適用于include()語(yǔ)句。下邊介紹require()語(yǔ)句所沒(méi)有的include()語(yǔ)句的功能和特點(diǎn)。
include語(yǔ)句只有在被執(zhí)行時(shí)才會(huì)讀入要包含的文件。在錯(cuò)誤處理方便,使用include語(yǔ)句,如果發(fā)生包含錯(cuò)誤,程序?qū)⑻^(guò)include語(yǔ)句,雖然會(huì)顯示錯(cuò)誤信息但是程序還是會(huì)繼續(xù)執(zhí)行!
php處理器會(huì)在每次遇到include()語(yǔ)句時(shí),對(duì)它進(jìn)行重新處理,所以可以根據(jù)不同情況的,在條件控制語(yǔ)句和循環(huán)語(yǔ)句中使用include()來(lái)包含不同的文件。
例如:
復(fù)制代碼 代碼如下:

<?php
$files=array('first.php','second.php','third.php');
for($i=0;$i<count($files);$i++)
{
include $files[$i];
}
?>

在php3.0和php4.0中include()語(yǔ)句所包含的文件中都可以使用return語(yǔ)句來(lái)返回一個(gè)值,并停止執(zhí)行被包含文件下面的內(nèi)容。但php3.0和php4.0在處理這樣的情況時(shí)有所不同。在php3.0中return語(yǔ)句不能包含在{}內(nèi),除非它在一個(gè)函數(shù)中,因?yàn)檫@時(shí)它表示函數(shù)的返回值而不是文件的返回值。而在php4.0中就沒(méi)有了這樣的限制,用戶甚至可以在文件中返回一個(gè)數(shù)字,就象函數(shù)的返回值一樣。這樣的語(yǔ)句在

php3.0中通常會(huì)報(bào)告錯(cuò)誤。以下舉例說(shuō)明:
假設(shè)被包含的文件為test.inc和主文件main.php位于一個(gè)目錄中。test.inc的內(nèi)容如下:
test.inc
復(fù)制代碼 代碼如下:

<?php
echo "Before the return<br>\n";
if(1)
{
return 27;
}
echo "After the return<br>\n";
?>

假設(shè)在main.php文件中包含下面的語(yǔ)句:
復(fù)制代碼 代碼如下:

<?php
$retval=include('test.inc');
echo "File returned:'$retval'<br>\n";
?>

php3.0解釋器會(huì)在第二行報(bào)告錯(cuò)誤,而不能得到include()語(yǔ)句的返回值。但在php4.0中會(huì)得到下面的結(jié)果:
Before the return
File returned: '27'
下邊假設(shè)main.php改為:
復(fù)制代碼 代碼如下:

<?php
include('test.inc');
echo "Back in main.html<br>\n";
?>

在php4.0中的輸出結(jié)果是:
Before the return
Back in main.html

在php5.0中的輸出結(jié)果也是:
Before the return
Back in main.html

在php3.0中的輸出結(jié)果是:
Before the return
27Back in main.html

Parse error:parse error in /apache/htdocs/phptest/main.html on line 5

出現(xiàn)上面的錯(cuò)誤是因?yàn)閞eturn語(yǔ)句位于{}內(nèi)部而且不是一個(gè)函數(shù)內(nèi)部。如果把{}去掉,使它位于test.inc的最外層,輸出結(jié)果是:
Before the return
27Back in main.html
之所以出現(xiàn)27,是因?yàn)樵趐hp3.0中不支持include()返回。

3.require_once()和include_once()語(yǔ)句
require_once()和include_once()語(yǔ)句分別對(duì)應(yīng)于require()和include()語(yǔ)句。require_once()和include_once()語(yǔ)句主要用于需要包含多個(gè)文件時(shí),可以有效地避免把同一段代碼包含進(jìn)去而出現(xiàn)函數(shù)或變量重復(fù)定義的錯(cuò)誤。例如:如果創(chuàng)建兩個(gè)文件util.inc和fool.inc,程序代碼分別為:
util.inc:
復(fù)制代碼 代碼如下:

<?php
define(PHPVERSION,floor(phpversion()));
echo "GLOBALS ARE NICE<br>\n";
function goodTea()
{
return "Olong tea tasts good!";
}
?>

和fool.inc:
復(fù)制代碼 代碼如下:

<?php
require ("util.inc");
function showVar($var)
{
if(PHPVERSION==4)
{
print_r($var);
}
else
{
var_dump($var);
}
}
?>

然后在error_require.php中包含這兩個(gè)文件:
復(fù)制代碼 代碼如下:

<?php
require("fool.inc");
require("util.inc");//此句會(huì)產(chǎn)生一個(gè)錯(cuò)誤
$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);
?>

當(dāng)運(yùn)行error_require.php時(shí),輸出結(jié)果如下:
GLOBALS ARE NICE
GLOBALS ARE NICE

Fatal error:Cannot redeclare goodTea() in util.inc on line 4

如果使用require_once()語(yǔ)句來(lái)代替 require()語(yǔ)句,就不會(huì)出現(xiàn)上面的錯(cuò)誤。我們把error_require.php和fool.inc中的require()語(yǔ)句改為require_once()語(yǔ)句并重命名為error_require_once.php,這是顯示結(jié)果如下:
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()語(yǔ)句的語(yǔ)法和include()語(yǔ)句類似,主要區(qū)別也是避免多次包含一個(gè)文件而引起函數(shù)或變量的重復(fù)定義。

require_once語(yǔ)句有一個(gè)引用鏈,它可以保證文件加入你的程序僅僅只有一次,而且會(huì)避開(kāi)變量值和函數(shù)名之間的沖突。

和require_once語(yǔ)句一樣,include_once語(yǔ)句把include的功能擴(kuò)展了。在程序執(zhí)行期間,將指定的文件包含進(jìn)來(lái),如果從文件引用進(jìn)來(lái)的程序先前已經(jīng)包含過(guò)的時(shí)候,include_once()就不會(huì)把它再包含進(jìn)來(lái)。也就是僅僅可以引用同一個(gè)文件一次!

include_once() 語(yǔ)句在腳本執(zhí)行期間包含并運(yùn)行指定文件。此行為和 include() 語(yǔ)句類似,唯一區(qū)別是如果該文件中的代碼已經(jīng)被包含了,則不會(huì)再次包含。如同此語(yǔ)句名字暗示的那樣,只會(huì)包含一次。

include_once() 應(yīng)該用于在腳本執(zhí)行期間同一個(gè)文件有可能被包含超過(guò)一次的情況下,想確保它只被包含一次以避免函數(shù)重定義,變量重新賦值等問(wèn)題。

使用 require_once() 和 include_once() 的更多例子見(jiàn)最新的 PHP 源程序發(fā)行包中的 PEAR 代碼。

返回值和 include() 相同。如果文件已被包含,本函數(shù)返回 TRUE。

注: include_once() 是 PHP 4.0.1pl2 中新加入的。

注: 要注意 include_once() 和 require_once() 在大小寫不敏感的操作系統(tǒng)中(例如 Windows)的行為

可能不是所期望的。
例子: include_once() 在 Windows 下不區(qū)分大小寫
復(fù)制代碼 代碼如下:

<?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 中改了,路徑先被規(guī)格化,因此 C:\PROGRA~1\A.php 和 C:\Program Files\a.php 的實(shí)現(xiàn)一樣,文件只會(huì)被包含一次。

如果要包含的文件不存在,include提示notice,然后繼續(xù)執(zhí)行下面的語(yǔ)句,require提示致命錯(cuò)誤并且退出。

  win32平臺(tái)下它們都是先包含后執(zhí)行,所以被包含文件里最好不要再有include或require語(yǔ)句,這樣會(huì)造成目錄混亂。或許Linux下情況不同,暫時(shí)還沒(méi)測(cè)試。

  如果一個(gè)文件不想被包含多次可以使用include_once或require_once## 讀取,可以寫入文檔數(shù)據(jù)。
復(fù)制代碼 代碼如下:

<?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;
}

相關(guān)文章

  • php文件包含目錄配置open_basedir的使用與性能詳解

    php文件包含目錄配置open_basedir的使用與性能詳解

    下面小編就為大家?guī)?lái)一篇php文件包含目錄配置open_basedir的使用與性能詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • PHP編程實(shí)現(xiàn)計(jì)算抽獎(jiǎng)概率算法完整實(shí)例

    PHP編程實(shí)現(xiàn)計(jì)算抽獎(jiǎng)概率算法完整實(shí)例

    這篇文章主要介紹了PHP編程實(shí)現(xiàn)計(jì)算抽獎(jiǎng)概率算法,結(jié)合完整實(shí)例形式分析了php隨機(jī)數(shù)運(yùn)算相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 關(guān)于php正則匹配漢字的方法介紹

    關(guān)于php正則匹配漢字的方法介紹

    本篇文章描述了,關(guān)于php正則匹配漢字的介紹。需要的朋友參考下
    2013-04-04
  • php PDO實(shí)現(xiàn)的事務(wù)回滾示例

    php PDO實(shí)現(xiàn)的事務(wù)回滾示例

    這篇文章主要介紹了php PDO實(shí)現(xiàn)的事務(wù)回滾功能,結(jié)合具體實(shí)例形式分析了php基于PDO操作實(shí)現(xiàn)事務(wù)回滾功能的相關(guān)SQL語(yǔ)句與操作技巧,需要的朋友可以參考下
    2017-03-03
  • PHP對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序的方法

    PHP對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序的方法

    在 PHP 中,可以使用函數(shù) array_multisort() 來(lái)對(duì)二維數(shù)組進(jìn)行排序處理,該函數(shù)可以按照指定的鍵或值對(duì)數(shù)組進(jìn)行排序,本文通過(guò)一個(gè)示例來(lái)給大家介紹一下PHP如何對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序,需要的朋友可以參考下
    2023-09-09
  • PHP時(shí)間函數(shù)使用詳解

    PHP時(shí)間函數(shù)使用詳解

    今天小編就為大家分享一篇關(guān)于PHP時(shí)間函數(shù)使用詳解,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-03-03
  • PHP遞歸實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看大小操作示例

    PHP遞歸實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看大小操作示例

    這篇文章主要介紹了PHP遞歸實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看大小操作,結(jié)合實(shí)例形式分析了php遞歸算法結(jié)合php常用文件夾操作函數(shù)實(shí)現(xiàn)文件夾的復(fù)制、刪除、查看等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-08-08
  • 簡(jiǎn)單實(shí)用的PHP防注入類實(shí)例

    簡(jiǎn)單實(shí)用的PHP防注入類實(shí)例

    這篇文章主要介紹了簡(jiǎn)單實(shí)用的PHP防注入類實(shí)例,以兩個(gè)簡(jiǎn)單的防注入類為例介紹了PHP防注入的原理與技巧,對(duì)網(wǎng)站安全建設(shè)來(lái)說(shuō)非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-12-12
  • 什么是PHP7中的孤兒進(jìn)程與僵尸進(jìn)程

    什么是PHP7中的孤兒進(jìn)程與僵尸進(jìn)程

    在本篇內(nèi)容里小編給大家整理了關(guān)于PHP7之孤兒進(jìn)程與僵尸進(jìn)程的知識(shí)點(diǎn)和概念,需要的朋友們學(xué)習(xí)參考下。
    2019-04-04
  • php遍歷樹(shù)的常用方法匯總

    php遍歷樹(shù)的常用方法匯總

    這篇文章主要介紹了php遍歷樹(shù)的常用方法,實(shí)例分析了php常用的三種遍歷樹(shù)的技巧,需要的朋友可以參考下
    2015-06-06

最新評(píng)論

长子县| 石渠县| 高安市| 晴隆县| 嘉黎县| SHOW| 深水埗区| 汾阳市| 东丽区| 伊宁县| 东安县| 高陵县| 兴仁县| 阆中市| 颍上县| 根河市| 伊宁县| 涟源市| 磐安县| 博乐市| 孟村| 阿图什市| 金沙县| 蓬莱市| 石柱| 原阳县| 海南省| 汶川县| 法库县| 泾川县| 罗江县| 黑山县| 德钦县| 牙克石市| 惠东县| 南陵县| 旬邑县| 昌图县| 黔西县| 红桥区| 凌海市|