PHP的autoload自動(dòng)加載機(jī)制使用說(shuō)明
更新時(shí)間:2010年12月28日 14:26:38 作者:
自PHP5后,引入了__autoload這個(gè)攔截器方法,可以自動(dòng)對(duì)class文件進(jìn)行包含引用,下面看具體的使用方法。
在PHP開發(fā)過(guò)程中,如果希望從外部引入一個(gè)class,通常會(huì)使用include和require方法,去把定義這個(gè)class的文件包含進(jìn)來(lái),但是這樣可能會(huì)使得在引用文件的新腳本中,存在大量的include或require方法調(diào)用,如果一時(shí)疏忽遺漏則會(huì)產(chǎn)生錯(cuò)誤,使得代碼難以維護(hù)。
自PHP5后,引入了__autoload這個(gè)攔截器方法,可以自動(dòng)對(duì)class文件進(jìn)行包含引用,通常我們會(huì)這么寫:
function __autoload($className) {
include_once $className . '.class.php';
}
$user = new User();
當(dāng)PHP引擎試圖實(shí)例化一個(gè)未知類的操作時(shí),會(huì)調(diào)用__autoload()方法,在PHP出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。因此,上面的這段代碼執(zhí)行時(shí),PHP引擎實(shí)際上替我們自動(dòng)執(zhí)行了一次__autoload方法,將User.class.php這個(gè)文件包含進(jìn)來(lái)。
在__autoload函數(shù)中拋出的異常不能被catch語(yǔ)句塊捕獲并導(dǎo)致致命錯(cuò)誤。
如果使用 PHP的CLI交互模式時(shí),自動(dòng)加載機(jī)制將不會(huì)執(zhí)行。
當(dāng)你希望使用PEAR風(fēng)格的命名規(guī)則,例如需要引入U(xiǎn)ser/Register.php文件,也可以這么實(shí)現(xiàn):
//加載我
function __autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . 'php';
}
$userRegister = new User_Register();
這種方法雖然方便,但是在一個(gè)大型應(yīng)用中如果引入多個(gè)類庫(kù)的時(shí)候,可能會(huì)因?yàn)椴煌悗?kù)的autoload機(jī)制而產(chǎn)生一些莫名其妙的問(wèn)題。在PHP5引入SPL標(biāo)準(zhǔn)庫(kù)后,我們又多了一種新的解決方案,spl_autoload_register()函數(shù)。
此函數(shù)的功能就是把函數(shù)注冊(cè)至SPL的__autoload函數(shù)棧中,并移除系統(tǒng)默認(rèn)的__autoload()函數(shù)。一旦調(diào)用spl_autoload_register()函數(shù),當(dāng)調(diào)用未定義類時(shí),系統(tǒng)會(huì)按順序調(diào)用注冊(cè)到spl_autoload_register()函數(shù)的所有函數(shù),而不是自動(dòng)調(diào)用__autoload()函數(shù),下例調(diào)用的是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()的時(shí)候,我們還可以考慮采用一種更安全的初始化調(diào)用方法,參考如下:
//系統(tǒng)默認(rèn)__autoload函數(shù)
function __autoload($className) {
include_once $className . '.class.php';
}
//可供SPL加載的__autoload函數(shù)
function autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . '.php';
}
//不小心加載錯(cuò)了函數(shù)名,同時(shí)又把默認(rèn)__autoload機(jī)制給取消了……囧
spl_autoload_register('_autoload', false);
//容錯(cuò)機(jī)制
if(false === spl_autoload_functions()) {
if(function_exists('__autoload')) {
spl_autoload_register('__autoload', false);
}
}
奇技淫巧:在Unix/Linux環(huán)境下,如果你有多個(gè)規(guī)模較小的類,為了管理方便,都寫在一個(gè)php文件中的時(shí)候,可以通過(guò)以ln -s命令做軟鏈接的方式快速分發(fā)成多個(gè)不同類名的拷貝,再通過(guò)autoload機(jī)制進(jìn)行加載。
自PHP5后,引入了__autoload這個(gè)攔截器方法,可以自動(dòng)對(duì)class文件進(jìn)行包含引用,通常我們會(huì)這么寫:
復(fù)制代碼 代碼如下:
function __autoload($className) {
include_once $className . '.class.php';
}
$user = new User();
當(dāng)PHP引擎試圖實(shí)例化一個(gè)未知類的操作時(shí),會(huì)調(diào)用__autoload()方法,在PHP出錯(cuò)失敗前有了最后一個(gè)機(jī)會(huì)加載所需的類。因此,上面的這段代碼執(zhí)行時(shí),PHP引擎實(shí)際上替我們自動(dòng)執(zhí)行了一次__autoload方法,將User.class.php這個(gè)文件包含進(jìn)來(lái)。
在__autoload函數(shù)中拋出的異常不能被catch語(yǔ)句塊捕獲并導(dǎo)致致命錯(cuò)誤。
如果使用 PHP的CLI交互模式時(shí),自動(dòng)加載機(jī)制將不會(huì)執(zhí)行。
當(dāng)你希望使用PEAR風(fēng)格的命名規(guī)則,例如需要引入U(xiǎn)ser/Register.php文件,也可以這么實(shí)現(xiàn):
復(fù)制代碼 代碼如下:
//加載我
function __autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . 'php';
}
$userRegister = new User_Register();
這種方法雖然方便,但是在一個(gè)大型應(yīng)用中如果引入多個(gè)類庫(kù)的時(shí)候,可能會(huì)因?yàn)椴煌悗?kù)的autoload機(jī)制而產(chǎn)生一些莫名其妙的問(wèn)題。在PHP5引入SPL標(biāo)準(zhǔn)庫(kù)后,我們又多了一種新的解決方案,spl_autoload_register()函數(shù)。
此函數(shù)的功能就是把函數(shù)注冊(cè)至SPL的__autoload函數(shù)棧中,并移除系統(tǒng)默認(rèn)的__autoload()函數(shù)。一旦調(diào)用spl_autoload_register()函數(shù),當(dāng)調(diào)用未定義類時(shí),系統(tǒng)會(huì)按順序調(diào)用注冊(cè)到spl_autoload_register()函數(shù)的所有函數(shù),而不是自動(dòng)調(diào)用__autoload()函數(shù),下例調(diào)用的是User/Register.php而不是User_Register.class.php:
復(fù)制代碼 代碼如下:
//不加載我
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()的時(shí)候,我們還可以考慮采用一種更安全的初始化調(diào)用方法,參考如下:
復(fù)制代碼 代碼如下:
//系統(tǒng)默認(rèn)__autoload函數(shù)
function __autoload($className) {
include_once $className . '.class.php';
}
//可供SPL加載的__autoload函數(shù)
function autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . '.php';
}
//不小心加載錯(cuò)了函數(shù)名,同時(shí)又把默認(rèn)__autoload機(jī)制給取消了……囧
spl_autoload_register('_autoload', false);
//容錯(cuò)機(jī)制
if(false === spl_autoload_functions()) {
if(function_exists('__autoload')) {
spl_autoload_register('__autoload', false);
}
}
奇技淫巧:在Unix/Linux環(huán)境下,如果你有多個(gè)規(guī)模較小的類,為了管理方便,都寫在一個(gè)php文件中的時(shí)候,可以通過(guò)以ln -s命令做軟鏈接的方式快速分發(fā)成多個(gè)不同類名的拷貝,再通過(guò)autoload機(jī)制進(jìn)行加載。
您可能感興趣的文章:
- PHP命名空間和自動(dòng)加載類
- PHP動(dòng)態(tài)地創(chuàng)建屬性和方法, 對(duì)象的復(fù)制, 對(duì)象的比較,加載指定的文件,自動(dòng)加載類文件,命名空間
- php面向?qū)ο笕ヂ?(十七) 自動(dòng)加載類
- PHP命名空間與自動(dòng)加載類詳解
- php _autoload自動(dòng)加載類與機(jī)制分析
- PHP框架自動(dòng)加載類文件原理詳解
- PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之命名空間與自動(dòng)加載類詳解
- 說(shuō)說(shuō)PHP的autoLoad自動(dòng)加載機(jī)制
- php自動(dòng)加載的兩種實(shí)現(xiàn)方法
- PHP 自動(dòng)加載類原理與用法實(shí)例分析
相關(guān)文章
PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之命名空間與自動(dòng)加載類詳解
這篇文章主要介紹了PHP面向?qū)ο蟪绦蛟O(shè)計(jì)之命名空間與自動(dòng)加載類,結(jié)合實(shí)例形式分析了php命名空間與自動(dòng)加載類的概念、功能、使用方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-12-12
Nginx環(huán)境下PHP flush失效的解決方法
最近在工作中發(fā)現(xiàn)了一個(gè)問(wèn)題,PHP的flush居然失效了,從網(wǎng)上找了一些資料,發(fā)現(xiàn)是Nginx的原因,所以這篇文章就給大家介紹了問(wèn)題與解決辦法,有需要的朋友們下面來(lái)一起看看吧。2016-10-10
php學(xué)習(xí)筆記之字符串常見操作總結(jié)
這篇文章主要介紹了php學(xué)習(xí)筆記之字符串常見操作,結(jié)合實(shí)例形式總結(jié)分析了php字符串的定義、單引號(hào)與雙引號(hào)的用法以及常見字符串操作函數(shù)使用技巧,需要的朋友可以參考下2019-07-07
PHP利用REFERER根居訪問(wèn)來(lái)地址進(jìn)行頁(yè)面跳轉(zhuǎn)
這篇文章主要是根據(jù)referfer判斷來(lái)源,然后跳轉(zhuǎn)到制定頁(yè)面,以防出現(xiàn)了無(wú)法訪問(wèn)頁(yè)面,用戶體驗(yàn)不好2013-09-09
PHP實(shí)現(xiàn)的pdo連接數(shù)據(jù)庫(kù)并插入數(shù)據(jù)功能簡(jiǎn)單示例
這篇文章主要介紹了PHP實(shí)現(xiàn)的pdo連接數(shù)據(jù)庫(kù)并插入數(shù)據(jù)功能,結(jié)合簡(jiǎn)單示例形式分析了pdo數(shù)據(jù)庫(kù)連接及執(zhí)行基本的插入SQL語(yǔ)句相關(guān)操作技巧,需要的朋友可以參考下2019-03-03
PHP簡(jiǎn)單實(shí)現(xiàn)DES加密解密的方法
這篇文章主要介紹了PHP簡(jiǎn)單實(shí)現(xiàn)DES加密解密的方法,涉及php中mcrypt_encrypt與mcrypt_decrypt方法的相關(guān)使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
PHP實(shí)現(xiàn)簡(jiǎn)單的協(xié)程任務(wù)調(diào)度demo示例
這篇文章主要介紹了PHP實(shí)現(xiàn)簡(jiǎn)單的協(xié)程任務(wù)調(diào)度demo,結(jié)合實(shí)例形式詳細(xì)分析了PHP基于協(xié)程的任務(wù)調(diào)度基本原理、定義及使用技巧,需要的朋友可以參考下2020-02-02

