搜尋
首頁後端開發php教程讓你徹底搞清楚PHP中的include和require!

在PHP中,有兩種​​包含外部檔案的方式,分別是include和require。他們之間有什麼不同呢?

如果檔案不存在或發生了錯誤,require產生E_COMPILE_ERROR等級的錯誤,程式停止運作。而include只產生警告,腳本會繼續執行。

這就是它們最主要的區別,其他方面require基本上等同於include。

  • 被包含檔案先依參數給定的路徑尋找,如果沒有給目錄(只有檔案名稱)時則依照 include_path 指定的目錄尋找。如果在include_path 下沒找到該檔案則include 最後才在呼叫腳本檔案所在的目錄和目前工作目錄下尋找
  • 如果定義了路徑不管是絕對路徑還是目前目錄的相對路徑include_path 都會被完全忽略
  • include_path 在php.ini中定義
  • 當一個檔案被包含時,其中所包含的程式碼繼承了include 所在行的變數範圍。從該處開始,呼叫檔案在該行處可用的任何變數在被呼叫的檔案中也都可用。不過所有在包含檔案中定義的函數和類別都具有全域作用域

除了普通的require和include之外,還有require_once和include_once,他們的作用是:

  • 如果該文件中已經包含過,則不會再次包含。如同此語句名字暗示的那樣,只會包含一次
  • 可以用於在腳本執行期間同一個檔案有可能被包含超過一次的情況下,想確保它只被包含一次以避免函數重定義,變數重新賦值等問題

我們來看些例子:

// a.php 不存在
include "a.php"; // warning
// require "a.php"; // error

echo 111; // 使用include时111会输出

// file1.php 中只有一行代码echo 'file1';
require_once 'includeandrequire/file1.php'; // file1
require_once 'includeandrequire/file1.php'; // noting

include_once 'includeandrequire/file1.php'; // noting
include_once 'includeandrequire/file1.php'; // noting

require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1

require 'includeandrequire/file1.php'; // file1
require 'includeandrequire/file1.php'; // file1

我們可以看出當第一個_once載入成功後,後面不管是require_once還是include_once,都不會再載入這個檔案了。而不帶_once的則會重複載入檔案。

file2.php

<?php echo &#39;file2:&#39; . $a, PHP_EOL;
echo &#39;file2:&#39; . $b, PHP_EOL;
$b = "file2";

myFile.php

<?php

$a = &#39;myFile&#39;;
$b = &#39;youFile&#39;;
require_once &#39;includeandrequire/file2.php&#39;;
echo $a, PHP_EOL;
echo $b, PHP_EOL;

// 输出结果
// file2:myFile
// file2:youFile
// myFile
// file2

file3.php
<?php

$c = &#39;file3&#39;;

myFile.php
<?php
function test(){
    require_once &#39;includeandrequire/file3.php&#39;;
    echo $c, PHP_EOL; // file3
}
test();
echo $c, PHP_EOL; // empty

被包含檔案中可以取得到父檔案中的變量,父檔案也可以獲得包含檔案中的變量,但是,需要注意_once的一個特殊情況。

function foo(){
    require_once 'includeandrequire/file3.php';
    return $c;
}

for($a=1;$a<p>使用_once並且循環載入時,只有第一次會輸出file3.php中的內容,這是為什麼呢?因為現在的變數範圍作用域在方法中,第一次載入完成後,後面的檔案不會再被載入了,這時後面四次迴圈並沒有$c被定義,$c預設就是空值了。 </p><p>如果兩個方法中同時用_once載入了一個文件,第二個方法還會載入嗎? </p><pre class="brush:php;toolbar:false">function test1(){
    require_once 'includeandrequire/file1.php';
}
function test2(){
    require_once 'includeandrequire/file1.php';
}
test1(); // file1
test2(); // empty

抱歉,只有第一個方法會載入成功,第二個方法不會再載入了。

那麼,我們在日常的開發中,使用哪個比較好呢?

  • 從效率來說,_once需要驗證是否已經加載過文件,效率會低一些,但是並不是絕對的,甚至是我們肉眼不可見的降低,所以可以忽略它的效率問題。而它帶來的好處則比不帶_once的多得多
  • 本著錯誤提前的原則,使用require_once更好。因為將PHP報錯等級調整為不顯示警告後,include的警告訊息會不可見,會帶來不可預測的錯誤
  • 在方法中使用時,不應該用_once來載入文件,特別是這個檔案需要在多個類別或方法中使用時,使用_once可能會導致後面的方法中無法載相同的檔案
  • 使用require或include時,最好不要用括號,雖然的確可以這麼使用,如include ('xxx.php'); 它們是表達式關鍵字,不是系統方法,所以直接用include 'xxx.php' 即可

include和require的檔案如果有return,可以用變數接收retun回來的數據,另外它們還可以載入非PHP檔案以及遠端檔案(遠端載入需要確定php.ini中的allow_url_include為On),如:

file4.php
<?php return &#39;file4&#39;;

file4.txt
可以吧

myFile.php
<?php
$v = require &#39;includeandrequire/file4.php&#39;;
echo $v, PHP_EOL; // file4

include &#39;includeandrequire/file4.txt&#39;;
// 可以吧

include &#39;https://www.baidu.com/index.html&#39;;
// 百度首页的html代码

這下我們對於include和require的了解就非常深入了吧,這兩個加載文件的方式並不復雜,但也很容易出現一些坑,特別是_once在方法中使用的時候一定要特別注意。最後,給一個小福利,封裝一個一次性載入目錄中所有檔案的方法:

function include_all_once ($pattern) {
    foreach (glob($pattern) as $file) { 
        require $file;
    }
}

include_all_once('includeandrequire/*');
测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/201911/source/%E5%BD%BB%E5%BA%95%E6%90%9E%E6%98%8E%E7%99%BDPHP%E4%B8%AD%E7%9A%84include%E5%92%8Crequire.php

以上是讓你徹底搞清楚PHP中的include和require!的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文轉載於:segmentfault。如有侵權,請聯絡admin@php.cn刪除
PHP與Python:了解差異PHP與Python:了解差異Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

php:死亡還是簡單地適應?php:死亡還是簡單地適應?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不斷適應和進化。 1)PHP從1994年起經歷多次版本迭代,適應新技術趨勢。 2)目前廣泛應用於電子商務、內容管理系統等領域。 3)PHP8引入JIT編譯器等功能,提升性能和現代化。 4)使用OPcache和遵循PSR-12標準可優化性能和代碼質量。

PHP的未來:改編和創新PHP的未來:改編和創新Apr 11, 2025 am 12:01 AM

PHP的未來將通過適應新技術趨勢和引入創新特性來實現:1)適應云計算、容器化和微服務架構,支持Docker和Kubernetes;2)引入JIT編譯器和枚舉類型,提升性能和數據處理效率;3)持續優化性能和推廣最佳實踐。

您什麼時候使用特質與PHP中的抽像類或接口?您什麼時候使用特質與PHP中的抽像類或接口?Apr 10, 2025 am 09:39 AM

在PHP中,trait適用於需要方法復用但不適合使用繼承的情況。 1)trait允許在類中復用方法,避免多重繼承複雜性。 2)使用trait時需注意方法衝突,可通過insteadof和as關鍵字解決。 3)應避免過度使用trait,保持其單一職責,以優化性能和提高代碼可維護性。

什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?什麼是依賴性注入容器(DIC),為什麼在PHP中使用一個?Apr 10, 2025 am 09:38 AM

依賴注入容器(DIC)是一種管理和提供對象依賴關係的工具,用於PHP項目中。 DIC的主要好處包括:1.解耦,使組件獨立,代碼易維護和測試;2.靈活性,易替換或修改依賴關係;3.可測試性,方便注入mock對象進行單元測試。

與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。與常規PHP陣列相比,解釋SPL SplfixedArray及其性能特徵。Apr 10, 2025 am 09:37 AM

SplFixedArray在PHP中是一種固定大小的數組,適用於需要高性能和低內存使用量的場景。 1)它在創建時需指定大小,避免動態調整帶來的開銷。 2)基於C語言數組,直接操作內存,訪問速度快。 3)適合大規模數據處理和內存敏感環境,但需謹慎使用,因其大小固定。

PHP如何安全地上載文件?PHP如何安全地上載文件?Apr 10, 2025 am 09:37 AM

PHP通過$\_FILES變量處理文件上傳,確保安全性的方法包括:1.檢查上傳錯誤,2.驗證文件類型和大小,3.防止文件覆蓋,4.移動文件到永久存儲位置。

什麼是無效的合併操作員(??)和無效分配運算符(?? =)?什麼是無效的合併操作員(??)和無效分配運算符(?? =)?Apr 10, 2025 am 09:33 AM

JavaScript中處理空值可以使用NullCoalescingOperator(??)和NullCoalescingAssignmentOperator(??=)。 1.??返回第一個非null或非undefined的操作數。 2.??=將變量賦值為右操作數的值,但前提是該變量為null或undefined。這些操作符簡化了代碼邏輯,提高了可讀性和性能。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能