大多數的程式執行狀況都一樣,把程式碼載入到記憶體中再由上到下執行,所以理論上,只要把程式碼都寫在同一個檔案中,就能執行完整的程式內容;
但是這種把全部程式碼都集在一個檔案的做法會讓整個系統變得擁腫難以維護,因此大多數的程式語言都有其專屬的一套機制來讓程式之間可以互相引入或彼此呼叫的做法;
在PHP中,用來引入檔案的主要指令有兩個include和require.
基本概念
對初學者來說,把原本一個檔案的東西拆解成多個檔案似乎是把事情變得麻煩,而且在修改時要在檔案之間跳來跳去的很不直覺;
但是當專案的規模擴張,團隊工作的人也變多時,原本在單一檔案的工作方式會受到比較大的挑戰,比如A沒有完成某個程式的功能時,B就無法工作,而A和B其實是負責不同的功能,只是因為功能都在同一個檔案中,所以無法同時工作。
傳統網頁的做法,每個頁面都是獨立的檔案
PHP中把重覆的內容獨立出來,以引入的方式來產生網頁
因此在實務面來說,這種拆解程式碼的做法主要目的為以下幾點:
- 方便分工,將不同人負責的程式碼拆分成不同的檔案,各自開發和維護
- 減少重覆,經常使用到的程式碼片段可以獨立出來,需要時再引入即可,而且修改時只需要修改一個檔案,所以引用的檔案都會生效
- 模組化,將功能模組或是屬性類似的功能放在同一個檔案中,將來要維護時會比較好找
- 程式化管理,適當的拆解可以做到在程式有需要時再引入,不用佔據記憶體空間
- 隱藏檔案真實路徑,有時重要的程式碼片段會希望不要曝露在公開的網址上,透過引入的方式,使用者只會看到公開的主要檔案路徑及檔名
include 和 include_once
- include 可在php程式執行過程中來引入檔案
- 可以放在程式的流程控制區段中
- include_once會在引入時先檢查同樣檔名的內容是否已經引用過了
- 檔案不存在時會跳錯誤訊息,但繼續執行後面的程式
1 |
|
require 和 require_once
- 在php檔案執行前先引入檔案
- 一般會放在檔案的最前面先執行
- 檔案不存在時會跳出嚴重錯誤,並中止程式
1 | require('common.php'); |
include 和 require的差異
include 和 require的差異幾乎是PHP工程師在面試時80%會被問到的問題:
差異項目 | include | require |
---|---|---|
發生錯誤的型態 | 會引發 warning error 但不會讓程式中止執行 | 會引發 fatal error 造成程式中止執行 |
執行的位置 | 可以放在程式流程中執行 | 一般放在程式最前面先執行 |
適用場景 | 適合動態的檔案引入,比如會因為變數的不同 而讓 include 檔案的執行結果不同的內容 |
適合靜態的檔案引入,比如函式庫, 常數定義等等 |