php include() require() require_once() 整理說明

  •  include()  require()  區別

    • 引用文件方式

      • 對於include()來說,在include()執行時文件每次都要進行讀取和評估;
      • 對於require()來說,文件只處理一次(實際上,文件內容替換了require()語句)。
      • 這就意味着如果有包含這些指令之一的代碼和可能執行多次的代碼,則使用require()效率比較高。
    •  是否有條件引用

      • include()是有條件包含函數,只有程序執行到該代碼段時,纔會調用外部文件。
      • require()則是無條件包含函數,只要程序一執行,就會立刻調用外部文件。
      • 例如在下面的一個例子中,如果變量$somgthing爲真,則將包含文件somefile:
        if($something){
        include("somefile");
        }
        但不管$something取何值,下面的代碼將把文件somefile包含進文件裏:
        if($something){
        require("somefile");
        }
        下面的這個有趣的例子充分說明了這兩個函數之間的不同。
        $i = 1;
        while ($i < 3) {
        require("somefile.$i");
        $i++;
        }
        在這段代碼中,每一次循環的時候,程序都將把同一個文件包含進去。很顯然這不是程序員的初衷,從代碼中我們可以看出這段代碼希望在每次循環時,將不同的文件包含進來。如果要完成這個功能,必須求助函數include():
        $i = 1;
        while ($i < 3) {
        include("somefile.$i");
        $i++;
        }
      • 如果每次執行代碼時相讀取不同的文件(雖然不大可能),性能。或者有通過一組文件疊代的循環,就使用include(),因爲可以給想要包括的文件名設置一個變量,當參數爲include()時使用這個變量。
  • 處理錯誤會時會有所不同

    • 用例子來說話,寫兩個php文件,名字爲test1.php  和test2.php,注意相同的目錄中,不要存在一個名字是test999.php的文件。
      test.php
      <?PHP
      include  (”test999.php”);
      echo  “abc”;
      ?>

      test2.php
      <?PHP
      require (”test999.php”)
      echo  “abc”;
      ?>

      瀏覽第一個文件,因爲沒有找到test999.php文件,我們看到了報錯信息,同時,報錯信息的下邊顯示了abc,你看到的可能是類似下邊的情況:
      Warning: include(test1aaa.php) [function.include]: failed to open stream: No such file or directory in D:\WebSite\test.php on line 2

      Warning: include() [function.include]: Failed opening ‘test1aaa.php’ for inclusion (include_path=’.;C:\php5\pear’) in D:\WebSite\test.php on line 2
      abc

      瀏覽第二個文件,因爲沒有找到test999.php文件,我們看到了報錯信息,但是,報錯信息的下邊沒有顯示abc,你看到的可能是類似下邊的情況:
      Warning: require(test1aaa.php) [function.require]: failed to open stream: No such file or directory in D:\WebSite\test.php on line 2

      Fatal error: require() [function.require]: Failed opening required ‘test1aaa.php’ (include_path=’.;C:\php5\pear’) in D:\WebSite\test.php on line 2

      現在就能很清楚的知道include和require的區別:include引入文件的時候,如果碰到錯誤,會給出提示,並繼續運行下邊的代碼,require引入文件的時候,如果碰到錯誤,會給出提示,並停止運行下邊的代碼。

  •  include_once和require_once:

    • include_once:使用include_once會在導入文件前先檢測該文件是否在該頁面的其他部分被應用過,如果有,則不會重複引用該文件,程序只能引用一次。(要導入的文件中存在一些自定義函數,那麼如果在同一個程序中重複導入這個文件,在第二次導入時便會發生錯誤,因爲php不允許相同名稱的函數被重複聲明)
    • require_once:require_once語句是require語句的延伸,他的功能與require語句基本一致,不同的是,在應用require_once時,先會檢查要引用的文件是不是已將在該程序中的其他地方被引用過,如果有,則不會在重複調用該文件。(同事使用require_once語句在同一頁面中引用了兩個不同的文件,那麼在輸出時,只有第一個文件被執行,第二個引用的文件則不會被執行)
    • include_once語句在腳本執行期間調用外部文件發生錯誤時,但不會影響程序向下運行。而require_once語句則會出現一個致命的錯誤,用途都是確保一個被包含的文件只能被包含一次,使用這兩個語句可以防止意外的多次包含相同的數據庫,從而導致函數的重複定義併產生錯誤。
    • 在php中使用require_once/include_once雖然方便,但是代價昂貴,據測試數據來看,require_once比require慢3-4倍,所以在php開發中,我們應該儘量使用require/include。
    • 用class_exists或者function_exists檢查一下,確認沒有載入過再出手,至少比require_once能快上3倍。php4也可以用上。class_exists('MyClass') or requir('/path/MyClass.class.php');

    • php5可以使用__autoload來避免require,用__autoload之後比 require_once然後再實例化大概要快3倍左右,並且是動態加載。

    • 爲了減少與其它第三方類庫產生衝突的可能,建議不要直接使用__autoload,而是使用spl_autoload_register(PHP 5 >= 5.1.0RC1)

      參考鏈接
    • https://blog.csdn.net/u011598153/article/details/34087141
    • https://blog.csdn.net/weixin_40910753/article/details/79398279
    • https://blog.csdn.net/zy994914376/article/details/7565339
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章