PHP的autoload自動加載機制使用說明

在PHP開發過程當中,若是但願從外部引入一個class,一般會使用include和require方法,去把定義這個class的文件bao含進來,可是這樣可能會使得在引用文件的新腳本中,存在大量的include或require方法調用,若是一時疏忽遺漏則會產生錯誤,使得代碼難以維護。 自PHP5後,引入了__autoload這個攔截器方法,能夠自動對class文件進行bao含引用,一般咱們會這麼寫:
php

function __autoload($className) { 
    include_once $className . '.class.php'; 
} 
$user = new User();

當PHP引擎試圖實例化一個未知類的操做時,會調用__autoload()方法,在PHP出錯失敗前有了最後一個機會加載所需的類。所以,上面的這段代碼執行時,PHP引擎實際上替咱們自動執行了一次__autoload方法,將User.class.php這個文件bao含進來。 在__autoload函數中拋出的異常不能被catch語句塊捕獲並致使致命錯誤。 若是使用 PHP的CLI交互模式時,自動加載機制將不會執行。 當你但願使用PEAR風格的命名規則,例如須要引入User/Register.php文件,也能夠這麼實現: 安全

//加載我 
function __autoload($className) { 
    $file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
    include_once $file . 'php'; 
} 
$userRegister = new User_Register();

這種方法雖然方便,可是在一個大型應用中若是引入多個類庫的時候,可能會由於不一樣類庫的autoload機制而產生一些莫名其妙的問題。在PHP5引入SPL標準庫後,咱們又多了一種新的解決方案,spl_autoload_register()函數。 此 函數的功能就是把函數註冊至SPL的__autoload函數棧中,並移除系統默認的__autoload()函數。一旦調用 spl_autoload_register()函數,當調用未定義類時,系統會按順序調用註冊到spl_autoload_register()函數的全部函數,而不是自動調用__autoload()函數,下例調用的是User/Register.php而不是 User_Register.class.php:
函數

//不加載我 
function __autoload($className) { 
    include_once $className . '.class.php'; 
} 
//加載我 
function autoload($className) { 
    $file = str_replace('/', DIRECTORY_SEPARATOR, $className); 
    include_once $file . '.php'; 
} 
//開始加載 
spl_autoload_register('autoload'); 
$userRegister = new User_Register();

在使用spl_autoload_register()的時候,咱們還能夠考慮採用一種更安全的初始化調用方法,參考以下:
ui

//系統默認__autoload函數 
function __autoload($className) { 
    include_once $className . '.class.php'; 
} 
//可供SPL加載的__autoload函數 
function autoload($className) { 
    $file = str_replace('_', DIRECTORY_SEPARATOR, $className); 
    include_once $file . '.php'; 
} 
//不當心加載錯了函數名,同時又把默認__autoload機制給取消了……囧 
spl_autoload_register('_autoload', false); 
//容錯機制 
if(false === spl_autoload_functions()) { 
    if(function_exists('__autoload')) { 
        spl_autoload_register('__autoload', false); 
   } 
}
相關文章
相關標籤/搜索