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