PHP 中 include 和 require 的差別

這幾天在 Plurk 上,香腸問了一個問題:

php的require_once 和 include 差在哪裡?網路上有些講得好像很簡單 = =?

對於 include 和 require 的關係,相信對於很多初學者來說是不容易分清楚的

這裡提供了一個簡單的分法,和一些相關的資訊 

Require 和 Include 的差別

簡單的說, require 和 include 的差別主要是在於:

require 在找不到檔案時會觸發 Fatal Error 進而使程式執行停止

include  在找不到檔案時只會觸發 Warning 所以不對程式有任何影響

除了這個的差別之外,我想沒有任何的差別是可以去作分辯的,所以從他們二個再加上檢查是否已載入過的 once 後就變成:

require_once (在 require 時檢查是否已 require 過,如果是,就不再載入

include_once (在 include 時檢查是否已 include 過,如果是,就不再載入

Inline include/require

到這裡,我想很多人都會說:「啥!就這樣嗎」,所以我剛在查閱官方文件時也發現了一個 include/require 平常比較少用的功能:

把 include 當作一個語言構件(就像 if),用以引入某個檔案以後檢查它的回傳值

我想看這段文件不容易了解,我們看看這個範例:

test.php

<?php
/**
* 注意這裡是 if( (require ‘test1.php’) == 123)
* 而不是 if(require(‘test1.php’) == 123 )
*/
if((require ‘test1.php’) == 123)
{
echo ‘true’;
}
else
{
echo ‘not’;
}

test1.php

<?php
return 123;

這個程式最後會印出 true,為什麼?

因為這裡的 require 是語言構件,所以 (require ‘test1.php’)  可以看作是一個獨立執行的部份,會以這個執行的結果作 if 判斷

效能 Issue

最後,我想再對於效能的 issue 再作個討論,我常聽別人說 *_once 的都會比較慢

但後來我看了幾篇文章(如這篇)之後, 我覺得當我們只引入小部份的檔案時

對於效能可能沒有那麼大的衝擊,而也不用再這麼去再意這樣的微小差異。

相對於用這二個函數的差異,還不如去比相對路徑和絕對路徑的效能差異(這個就差很大了 XDD)

以上就是我對於這二個語言構件的心得,有任何問題歡迎留言討論