require(),include(),require_once()和include_once()區別與用法

require,include語句很有用,它們能包含位於獨立文件中的代碼,實現代碼結構的模塊化,方便調用。

require_once()和include_once()語句分別對應於require()和include()語句。require_once() 和include_once()語句主要用於需要包含多個文件時,可以有效地避免把同一段代碼包含進去而出現函數或變量重複定義的錯誤。

如果php配置文件php.ini中的URL fopen wrappers 是打開的(默認情況下是打開的),就可以使用URL來指定文件的位置從而實現遠程文件的調用。

這兩種結構除了在如何處理失敗之外完全一樣。include() 產生一個警告require() 則導致一個致命錯誤。換句話說,如果想在遇到丟失文件時停止處理頁面就用require()include() 就不是這樣,腳本會繼續運行。同時也要確認設置了合適的include_path。注意在 PHP 4.3.5 之前,包含文件中的語法錯誤不會導致程序停止,但從此版本之後會。

require()語句用於指定的文件代替語句本身,就象C語言中的include()語句一樣。

使用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語句發生了包含錯誤,那麼程序將輸出出錯信息並停止運行!!

如果require()語句通過聲明文件的URL來包含遠程文件,而且遠程服務器按照php代碼來解釋該文件的話,本地php文件中所包含的內容是在遠程服務器上處理以後的結果。例如:

  1. /*
  2. 這個例子假設some_server服務器可以解釋.php文件,而不對.txt文件進行解釋。在遠程文件中
  3. 需要變量$varfirst和$varsecond
  4. */
  5. /*不能正確執行,遠程服務器不處理.txt文件*/
  6. require("http://some_server/file.txt?varfirst=1&varsecond=2");
  7. /*不正確,這樣只能在本地機上尋找file.php文件*/
  8. require("file.php?varfirst=1&varsecond=2");
  9. /*正確的語句*/
  10. require("http://some_server/file.php?varfirst=1&varsecond=2");
  11. $varfirst=1;
  12. $varsecond=2;
  13. require("file.txt"); /*正確的語句*/
  14. require("file.php"); /*正確的語句*/

本來在php3.0中,require()所包含的文件可以使用return語句,但條件是return語句不能出現在{}內部,而必須出現在被包含文件的全局範圍內。在php4.0中已經取消了require()的這個功能,但是仍然可以使用include()來實現。

2.include()語句 

include()語句和require()語句有許多相同的地方。凡是在上邊require()語句中沒有明確說明不能適用於include()的部分外,require()語句的功能完全適用於include()語句。下邊介紹require()語句所沒有的include()語句的功能和特點。

include語句只有在被執行時纔會讀入要包含的文件。在錯誤處理方便,使用include語句,如果發生包含錯誤,程序將跳過include語句,雖然會顯示錯誤信息但是程序還是會繼續執行!

php處理器會在每次遇到include()語句時,對它進行重新處理,所以可以根據不同情況的,在條件控制語句和循環語句中使用include()來包含不同的文件。 例如:

  1. <?php
  2. $files=array('first.php','second.php','third.php');
  3. for($i=0;$i<count($files);$i++)
  4. {
  5. include $files[$i];
  6. }
  7. ?>

在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

  1. <?php
  2. echo "Before the return<br>\n";
  3. if(1)
  4. {
  5. return 27;
  6. }
  7. echo "After the return<br>\n";
  8. ?>

假設在main.php文件中包含下面的語句:

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

php3.0解釋器會在第二行報告錯誤,而不能得到include()語句的返回值。但在php4.0中會得到下面的結果: 
Before the return 
File returned: '27' 
下邊假設main.php改爲:

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

在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:

  1. <?php
  2. define(PHPVERSION,floor(phpversion()));
  3. echo "GLOBALS ARE NICE<br>\n";
  4. function goodTea()
  5. {
  6. return "Olong tea tasts good!";
  7. }
  8. ?>

和fool.inc:

  1. <?php
  2. require ("util.inc");
  3. function showVar($var)
  4. {
  5. if(PHPVERSION==4)
  6. {
  7. print_r($var);
  8. }
  9. else
  10. {
  11. var_dump($var);
  12. }
  13. }
  14. ?>

然後在error_require.php中包含這兩個文件:

  1. <?php
  2. require("fool.inc");
  3. require("util.inc");//此句會產生一個錯誤
  4. $foo=array("1",array("complex","quaternion"));
  5. echo "this is requiring util.inc again which is also<br>\n";
  6. echo "required in fool.inc\n";
  7. echo "Running goodTea:".goodTea()."<br>\n";
  8. echo "Printing foo:<br>\n";
  9. showVar($foo);
  10. ?>

當運行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 代碼。 


require_once

使用方法:

1
2
require_once "test.php";

一般是放在PHP文件的最前面將文件內容引入,PHP會先將待引入的文件內容引入到本文件中,如果引入失敗則不會繼續往下執行;如果引入成功,則可正常執行下面的代碼。

它的使用方式與require差不多,不同的是require_once只會引入一次,如果之前已引入過,則不會再引入!


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

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

注: 要注意 include_once() 和 require_once() 在大小寫不敏感的操作系統中(例如 Windows)的行爲 
  1. 使用方法:

    1
    include "test.php";

    一般是放在流程控制的處理部分中使用,將文件內容引入。PHP程序在遇到include語句時,纔將它讀進來,這種方式可以把程序執行時的流程簡單化,便於複用代碼!

    include在引入不存文件時產生一個警告且腳本還會繼續執行,執行時需要引用的文件每次都要進行讀取和評估,且有返回值,比如:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    if(FALSE) {
      include 'test.php'; // test.php不會被引入
    }
      
    <?php
     include 'test.php';// 現在的條件是test.php不存在
     echo '標哥的技術博客'; // 仍然執行下面的代碼
    ?>
      
    $ret = include "QueryPhone.php";
    if (!empty($ret)) {
      echo "文件引入成功";
    } else {
      echo "文件引入失敗";
    }

    include_once

    使用方法:

    1
    2
    include_once "test.php";

    加了_once之後,表示文件已引入的將不再引入。include_once引入文件的時候,如果碰到錯誤會給出提示並繼續運行下邊的代碼!

    他的使用方式與include差不多,不同的是include_once只引入一篇!

    require

    使用方法:

    1
    2
    require "test.php";

    一般是放在PHP文件的最前面將文件內容引入,PHP會將require的文件內容先引入成功當前文件的一部分,然後纔開始執行後面的代碼。

    require在引入文件失敗時會給出提示且腳本會被中斷執行。比如:

    1
    2
    3
    4
    5
    // 文件是不存在的
    require "QueryPhone.php";
      
    echo "沒有被打印";

    require_once

    使用方法:

    1
    2
    require_once "test.php";

    一般是放在PHP文件的最前面將文件內容引入,PHP會先將待引入的文件內容引入到本文件中,如果引入失敗則不會繼續往下執行;如果引入成功,則可正常執行下面的代碼。

    它的使用方式與require差不多,不同的是require_once只會引入一次,如果之前已引入過,則不會再引入!

    綜合例子

    假設有一個文件中a.php,裏面只有一句echo file name is a;

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      
    include 'a.php';
    require 'a.php';
      
    include_once 'a.php';
    require_once 'a.php';

    那麼上面這四個引入會打印多少行呢?其實只會打印前面的兩句代碼執行結果,因此只有兩個:

    1
    2
    3
    file name is a
    file name is a

    下面我們來交換一下前兩行與後兩行試試:

    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      
    include_once 'a.php';
    require_once 'a.php';
      
    include 'a.php';
    require 'a.php';

    那麼上面這四句會打印出多少行呢?自然是四行,因爲前兩行在此之前並沒有引入過,因此會引入一次,而include/require雖然之前引入過,還會再引入,因此打印結果:

    1
    2
    3
    4
    5
    file name is a
    file name is a
    file name is a
    file name is a

    注意事項

    從理論上說,include和require後面加不加括號對執行的結果並沒有什麼區別,但是加上括號效率相對會較低,所以通常後面能不加括號就不要添加括號了!

    }
發佈了31 篇原創文章 · 獲贊 23 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章