徹底搞明白PHP中的include和require

2021-10-07 23:04:21 字數 2950 閱讀 3214

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

如果檔案不存在或發生了錯誤,require產生e_compile_error級別的錯誤,程式停止執行。而include只產生警告,指令碼會繼續執行。

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

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

我們來看些例子:

1// a.php 不存在

2include "a.php"; // warning

3// require "a.php"; // error

4 5echo 111; // 使用include時111會輸出

6 7// file1.php 中只有一行**echo 'file1';

8require_once 'includeandrequire/file1.php'; // file1

9require_once 'includeandrequire/file1.php'; // noting

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

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

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

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

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

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

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

1file2.php

2 3<?php

4 5echo 'file2:' . $a, php_eol;

6echo 'file2:' . $b, php_eol;

7$b = "file2";

8 9myfile.php

1011<?php

1213$a = 'myfile';

14$b = 'youfile';

15require_once 'includeandrequire/file2.php';

16echo $a, php_eol;

17echo $b, php_eol;

1819// 輸出結果

20// file2:myfile

21// file2:youfile

22// myfile

23// file2

2425file3.php

26<?php

2728$c = 'file3';

2930myfile.php

31<?php

32function test()

36test();

37echo $c, php_eol; // empty

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

1function foo()

5 6for($a=1;$a<=5;$a++)

910// file3

11// empty

12// empty

13// empty

14// empty

使用_once並迴圈載入時,只有第一次會輸出file3.php中的內容,這是為什麼呢?因為現在的變數範圍作用域在方法中,第一次載入完成後,後面的的檔案不會再被載入了,這時後面四次迴圈並沒有$c被定義,$c預設就是空值了。

如果兩個方法中同時用_once載入了乙個檔案,第二個方法還會載入嗎?

1function test1()

4function test2()

7test1(); // file1

8test2(); // empty

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

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

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

1file4.php

2<?php

3 4return 'file4';

5 6file4.txt

7可以吧

8 9myfile.php

10<?php

11$v = require 'includeandrequire/file4.php';

12echo $v, php_eol; // file4

1314include 'includeandrequire/file4.txt';

15// 可以吧

1617include '';

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

1function include_all_once ($pattern) 5}6

7include_all_once('includeandrequire/*');

測試**:

參考文件:

徹底搞明白傳值,傳位址,傳引用

傳值是把實參的值賦值給形參,對形參的修改,不會影響實參的值。傳位址是傳值的一種特殊方式,只是傳遞的是位址,不是普通的型別如int 傳位址以後,實參和行參都指向同乙個物件 傳引用是真正的以位址的方式傳遞引數,傳遞以後,行參和實參都是同乙個物件,只是名字不同而已,對行參的修改將影響實參的值。python...

讓你徹底搞明白為什麼用樂觀鎖

看了掘金小冊以後,自認為對mysql的鎖有所認知,但是反而看的越多越困惑,在mysql 的innodb 引擎下,預設的隔離級別下,mysql已經通過讀使用mvcc,寫使用加鎖 的方式解決了併發的四大資料庫問題 髒寫,髒讀,不可重複讀,幻讀.所以看到這裡的時候我就在想,既然mysql底層機制已經解決了...

徹底弄明白JS中的函式提公升

函式宣告總會被提公升到函式體的最頂部。但是對於不同的函式宣告方法,提公升的東西不一樣。對於關鍵字function申明的函式,會將整個函式體提公升到作用域的頂部,而通過表示式宣告的函式,只會先將變數提公升,而賦值不會提公升。function foo return bar function bar co...