php入門--自動加載函數

之所以要使用自動加載函數,是因為當有外部類需要依賴時如果不使用自動加載函數就只能使用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"
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容