今天跟同事測試了PHP 載入的機制
覺得還滿值得分享的。
1.當前目錄,永遠都是程式進入點那一支。
甚麼意思呢?
我有三支檔案。
資料夾結構如下:
example1.php
exp1(資料夾)
|_exp1_1.php
|_exp1_2.php
三支PHP都會顯示自己的當前目錄( 利用getcwd() ),以視載入成功。
且example1.php載入include 'exp1/exp1_1.php' ;
exp1_1.php載入include 'exp1/exp1_2.php' ;
output:
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
表示,即便是在exp1_1.php之中
依舊是用C:\xampp\htdocs\include這樣的當前目錄來載入 exp1_2.php
2.載入的優先順序
我們現在改了一下檔案的狀況
我們另外加了一個資料夾和兩個檔案。
資料結構變這樣
example1.php
( 先忽略 ) exp1(資料夾)
( 先忽略 ) |_exp1_1.php
( 先忽略 ) |_exp1_2.php
exp2(資料夾)
|_exp2_1.php
|_exp2_2.php
這次的載入稍稍不一樣
example1.php載入include 'exp2/exp2_1.php' ;
但exp1_1.php載入include 'exp2_2.php' ;
第二個載入很神奇,因為我沒有以當前目錄來載入
但是一樣可以work!
output:
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
這個問題帶來第三個重點 - 誰優先載入?
3.誰優先載入?
為了測試,我又新增一個檔案
放在example1的同一層
資料結構變這樣
example1.php
exp2_2.php ( 印出__file__ )
( 先忽略 ) exp1(資料夾)
( 先忽略 ) |_exp1_1.php
( 先忽略 ) |_exp1_2.php
( 先忽略) exp2(資料夾)
( 先忽略) |_exp2_1.php
( 先忽略) |_exp2_2.php
output:
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include
C:\xampp\htdocs\include\exp2_2.php
因為exp2/exp2_2.php是印出路徑
exp2_2.php才是印出__file__
所以由結果來看,的確是以當前目錄為優先載入權。
我覺得還會繼續往下搜尋才真的超怪的吧!
不debug到死才怪。
4.ini_set('include_path', ) 可以改變__autoload讀取的順序
我另外開了一個檔案叫做main.php
並產生一個 class的實例,class name是 b
有趣的是,我在三個地方都有class b
main.php( $bChild = new b ; )
b.php
b1/b.php
b2/b.php
並且分別在建構子印出__file__
不用說,在預設狀況下是會先以b.php為主
但是我加了一段設定
ini_set("include_path",
PATH_SEPARATOR."b1"
.PATH_SEPARATOR."b2"
);
output:
C:\xampp\htdocs\include\b1\b.phpb
你看,變成我設定的先後順序了
我們故意把預設的設定放到最後
ini_set("include_path",
PATH_SEPARATOR."b1"
.PATH_SEPARATOR."b2"
.PATH_SEPARATOR.get_include_path()
);
output:
C:\xampp\htdocs\include\b1\b.phpb
結果依然沒變~
但是,一般來說我們不會這樣玩
我們還是會先把預設的設定放前面,然後在另外設定class第二個、第三個放置處。
會依照我們設定的先後順序去搜尋。
ini_set("include_path",
PATH_SEPARATOR.get_include_path()
.PATH_SEPARATOR."b1"
.PATH_SEPARATOR."b2"
);
output:
C:\xampp\htdocs\include\b.php
以上