首頁 >後端開發 >php教程 >php的autoload自動載入機制用法實例詳解

php的autoload自動載入機制用法實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-01 09:33:351484瀏覽

自PHP5後,引入了autoload這個攔截器方法,可以自動對class檔案進行包含引用,下面看具體的使用方法。

在PHP開發過程中,如果希望從外部引入一個class,通常會使用includerequire方法,去把定義這個class的檔案包含進來,但是這樣可能會使得在引用文件的新腳本中,存在大量的include或require方法調用,如果一時疏忽遺漏則會產生錯誤,使得程式碼難以維護。

自PHP5後,引入了autoload這個攔截器方法,可以自動對class檔案進行包含引用,通常我們會這麼寫: 

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

當PHP引擎試圖實例化一個未知類別的操作時,會呼叫autoload()方法,在PHP出錯失敗前有了最後一個機會載入所需的類別。因此,當上面的這段程式碼執行時,PHP引擎實際上為我們自動執行了一次autoload方法,將User.class.php這個檔案包含進來。

在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()的時候,我們還可以考慮採用一種更安全的初始化呼叫方法,參考如下:

程式碼如下:

//系统默认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); 
} 
}

在Unix/Linux環境下,如果你有多個規模較小的類,為了管理方便,都寫在一個php檔案中的時候,可以透過以ln -s指令做軟連結的方式快速分發成多個不同類別名稱的拷貝,再透過autoload機制進行載入。

以上是php的autoload自動載入機制用法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn