## include
1. 先按參數給出的路徑尋找,如果沒有給出目錄(只有文件名)時則按照 include_path 指定的目錄尋找。
1. 如果在 include_path 下沒找到該文件則 include 最后才在調用腳本文件所在的目錄和當前工作目錄下尋找。
1. 如果最后仍未找到文件則 include 結構會發出一條警告;這一點和 require 不同,后者會發出一個致命錯誤。
1. 如果定義了路徑——不管是絕對路徑(在 Windows 下以盤符或者 \ 開頭,在 Unix/Linux 下以 / 開頭)還是當前目錄的相對路徑(以 . 或者 .. 開頭)——include_path 都會被完全忽略。
## require
require 和 include 幾乎完全一樣,除了處理失敗的方式不同之外。
require 在出錯時產生 E_COMPILE_ERROR 級別的錯誤。
換句話說將導致腳本中止而 include 只產生警告(E_WARNING),腳本會繼續運行。
## PHP中的include_path
PHP在遇到require(_once)/include(_once)的指令的時候, 首先會做如下的判斷:
~~~
是否為絕對路徑?
- 是 , 則直接包含,并結束。
- 否, 進入另一個邏輯(經過多次調用,宏展開后進入_php_stream_fopen_with_path)尋找此文件)
~~~
接下來, 在_php_stream_fopen_with_path中, 會做如下判斷:
~~~
要包含的文件路徑是相對路徑么(形如./file, ../dir/file, 以下用”目錄相對路徑代替”)?
- 是, 則跳過include_path的作用邏輯, 直接解析相對路徑。
~~~
更詳細案例說明參閱鳥哥文章:
[http://www.laruence.com/2010/05/04/1450.html](http://www.laruence.com/2010/05/04/1450.html)
## 結論最好的使用絕對路徑
1.
因為使用include_path和相對路徑的情況下, 性能會和尋找的次數有關, 最壞的情況下, 如果你有10個include_path, 那么最多可能會重試11次才能找到要包含的文件, 所以, 在能使用絕對路徑的情況下最好使用絕對路徑.
1.
因為目錄相對路徑的basedir, 永遠都是當前工作路徑, 如果要使用, 需要和實際部署路徑相關, 所以實際使用的很少(當然, 也有借助chdir來完成的模塊).
1.
在模塊化的系統設計中, 一般應該在模塊內, 通過獲取模塊的部署路徑(dirname(**FILE**), php5.3以后更是提供了**DIR**常量)從而使用絕對路徑.
## include/require區別
require()語句的性能與include()相類似,都是包括并運行指定文件。
### 區別
include():
~~~
1. include引入文件的時候,如果碰到錯誤,會給出提示(Warning),并繼續運行下邊的代碼。
2. 在執行文件時每次都要進行讀取和評估
3. 一般是放在流程控制的處理區段中
4. PHP腳本文件在讀到include()語句時,才將它包含的文件讀取進來
5. include()是有條件包含函數
~~~
require():
~~~
1. require引入文件的時候,如果碰到錯誤,會給出提示(Fatal error),并停止運行下邊的代碼。
2. 文件只處理一次(實際上,文件內容替換require()語句)
3. 通常放在PHP腳本程序的最前面
4. PHP程序在執行前,就會先讀入require()語句所引入的文件,使它變成PHP腳本文件的一部分。
5. require()則是無條件包含函數
~~~
~~~
//變量$ok無論是何值,1.php都會被包含進來[在PHP程序執行前,就讀入require()語句]
if($ok){
require '1.php';
}
//變量$ok為真,則包含文件2.php
if($ok){
include '2.php';
}
~~~
### 結論
- incluce在用到時加載
- require在一開始就加載
- _once后綴表示已加載的不加載
- 如果可能執行多次的代碼,則使用require()效率比較高
- 如果每次執行代碼時是讀取不同的文件,或者有通過一組文件迭代的循環,就使用include()語句
- 前言
- PHP生成對象之設計模式—單例模式
- PHP生成對象之設計模式—工廠方法模式
- PHP之設計模式—適配器模式
- PHP之設計模式—建造者模式(通過選擇mysql,mongo數據庫鏈接類型做說明)
- PHP之設計模式—委托模式
- PHP面向對象學習一:對象基礎實踐
- PHP面向對象學習之二:深入了解面向對象高級特性
- PHP面向對象學習之三:抽象類和接口類的實際作用
- PHP解決問題進化論(整理筆記)
- PHP7新特性整理介紹篇
- php-fpm 與 Nginx優化總結
- Centos+Nginx+PHP7.0編譯安裝(和PHP5.6老版本共存)
- PHP7:Mongodb API使用
- PHP之include/require深入了解
- PHP內核了解:生命周期及運行模式