之所以要使用自動加載函數,是因為當有外部類需要依賴時如果不使用自動加載函數就只能使用require XXX.php
這樣引入一個文件的依賴,但是這樣做的問題在于如果需要大量的類的引入,就需要寫數個這樣的文件,并且如果有相關的類被刪除了,require關鍵字會造成錯誤。
function __autoload($class){
require __DIR__.'/'.$class.'.php';
}
但是事實上這樣的方式(autoload并不常用):
在php5.3以前自動加載函數是使用__autoload()
來實現的,但隨著各種框架的引入和業務邏輯的逐漸復雜,這個函數的一個問題顯現出來,就是當不同框架引入了多個__autoload()函數時,就會報出函數重復定義的致命錯誤。
而這個問題在php5.3被解決,使用spl_autoload_register
關鍵字來取代autoload()
函數,這樣做可以定義多個自動加載函數。這樣每個類就可以分別執行自己的載入函數。
<?php
/**
* Created by PhpStorm.
* User: Jo
* Date: 3/31/17
* Time: 5:27 PM
*/
spl_autoload_register('autoload3');
spl_autoload_register('autoload2');
spl_autoload_register('autoload1');
//require '/Applications/XAMPP/xamppfiles/htdocs/demo/test1.php';
//require '/Applications/XAMPP/xamppfiles/htdocs/demo/test2.php';
test1 :: test();
function autoload1($class){
require __DIR__.'/'.$class.'.php';
}
function autoload2($class){
echo "hello world";
}
function autoload3($class){
echo "test";
}
另外一個重點就是spl_autoload_register的執行順序,當有多個spl_autoload_register需要執行時,例如上面例子,執行的結果就是:
按代碼順序的執行結果
而如果將
spl_autoload_register
的順序換成spl_autoload_register('autoload1');
在最前面則執行結果會變成:
spl_autoload_register('autoload1')放在最前面的執行結果
之所以會出現這樣的不同是和多個spl_autoload_register的使用順序有關:
執行順序是按照注冊的順序,一個一個往下找,如果找到了就停止。
即在本例中找test1這個類,找到就停止。同時可以使用var_dump(spl_autoload_functions());
來打印出自動加載的順序
array(3) {
[0]=>
string(9) "autoload1"
[1]=>
string(9) "autoload3"
[2]=>
string(9) "autoload2"
}