PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析
本文較為深入的分析了PHP的autoload運(yùn)行機(jī)制。對(duì)于深入理解PHP運(yùn)行原理有一定的幫助作用。具體分析如下:
php實(shí)現(xiàn)autoload有兩種方法:
1、攔截器__autoload()
2、設(shè)置全局變量函數(shù)指針autoload_func為指定函數(shù)。通常在c擴(kuò)展中使用
本質(zhì)上前者還是通過(guò)后者實(shí)現(xiàn)的。
分析過(guò)程,PHP5.3.6源碼:
=>Zend/zend_vm_def.h 1894行
ZEND_VM_HANDLER(109,ZEND_FETCH_CLASS,...
=>zend_execute_API.c 1526行
zend_class_entry *zend_fetch_class(const char *class_name,...
=>zend_execute_API.c 1564行
if(zend_lookup_class_ex(class_name,class_name_len,...
=>zend_execute_API.c 1039行
ZEND_API int zend_lookup_class_ex(const char *na...
=>zend_execute_API.c 1121行
retval = zend_call_function(&fcall_info, &fcall_cache TSRMLS_CC);
=>zend_execute_API.c 758行
zend_call_function
顧名思義,zend_call_function的主要功能是調(diào)用PHP函數(shù)。其參數(shù)fcall_info, fcall_cache,分別指向兩個(gè)重要的結(jié)構(gòu),zend_fcall_info和zend_fcall_info_cache
zend_call_function主要工作流程如下:
如果fcall_cache.function_handler不為NULL,則直接執(zhí)行 fcall_cache.function_handler指向的函數(shù)。
如果 fcall_cache.function_handler為NULL,則嘗試查找函數(shù)名為fcall_info.function_name的函 數(shù),如果存在的話,則執(zhí)行之;
現(xiàn)總結(jié)如下,autoload機(jī)制的主要執(zhí)行過(guò)程為:
(1) 檢查執(zhí)行器全局變量函數(shù)指針autoload_func是否為NULL。
(2) 如果autoload_func不為NULL,則直接執(zhí)行autoload_func指針指向的函數(shù)用來(lái)加載類(lèi),并不檢查_(kāi)_autoload()函數(shù)是否定義。
(3) 如果autoload_func為NULL,則查找系統(tǒng)中是否定義有__autoload()函數(shù)。如果沒(méi)有定義,則報(bào)告錯(cuò)誤并退出;如果定義了__autoload()函數(shù),則執(zhí)行__autoload()嘗試加載類(lèi),并返回加載結(jié)果。
自動(dòng)加載方便了面向?qū)ο蠛痛a復(fù)用,但是多個(gè)類(lèi)庫(kù)不同的__autoload又會(huì)導(dǎo)致混亂??梢杂胹pl_autoload解決,將不同開(kāi)發(fā)者的攔截器函數(shù)都注冊(cè)到自動(dòng)加載函數(shù)的hashtable中。spl實(shí)現(xiàn)自動(dòng)加載的機(jī)制是維護(hù)一個(gè)hashtable,里面存儲(chǔ)有具有自動(dòng)加載功能的各個(gè)函數(shù)。
當(dāng)觸發(fā)自動(dòng)加載機(jī)制時(shí),zend會(huì)在遍歷執(zhí)行這個(gè)hashtable里面的函數(shù),直到成功加載類(lèi)或加載失敗后返回。
當(dāng)需要使用自動(dòng)加載功能時(shí),使用函數(shù)spl_autoload_register()或spl_autoload_register('autoloadfuncitonname')
無(wú)參的spl_autoload_register()會(huì)默認(rèn)加載spl_autoload()函數(shù),該函數(shù)功能有限,只能在inlcude_path中搜索指定擴(kuò)展名的類(lèi)庫(kù)。
有參的spl_autoload_register()默認(rèn)不再加載spl_autoload()函數(shù)。
可以通過(guò)spl_autoload_functions()查看當(dāng)前自動(dòng)加載hashtable中的函數(shù),該函數(shù)返回一個(gè)數(shù)組
注意:使用spl_autoload時(shí),系統(tǒng)會(huì)忽略攔截器__autoload,除非顯式地使用spl_autoload_register('__autoload')將其加入hashtable
希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所幫助
- PHP中spl_autoload_register()和__autoload()區(qū)別分析
- PHP中spl_autoload_register函數(shù)的用法總結(jié)
- PHP函數(shù)spl_autoload_register()用法和__autoload()介紹
- PHP spl_autoload_register實(shí)現(xiàn)自動(dòng)加載研究
- PHP中__autoload和Smarty沖突的簡(jiǎn)單解決方法
- thinkphp autoload 命名空間自定義 namespace
- php中spl_autoload詳解
- PHP中spl_autoload_register()函數(shù)用法實(shí)例詳解
相關(guān)文章
linux下的php-fpm參數(shù)配置介紹與參數(shù)優(yōu)化說(shuō)明
本文主要講解了在linux下php-fpm一些重要參數(shù)的中文詳細(xì)說(shuō)明,并詳細(xì)介紹了php-fpm關(guān)于性能方面的參數(shù)優(yōu)化介紹2017-12-12
PHP使用GETDATE獲取當(dāng)前日期時(shí)間作為一個(gè)關(guān)聯(lián)數(shù)組的方法
這篇文章主要介紹了PHP使用GETDATE獲取當(dāng)前日期時(shí)間作為一個(gè)關(guān)聯(lián)數(shù)組的方法,實(shí)例分析了php中GETDATE函數(shù)使用技巧,需要的朋友可以參考下2015-03-03
php實(shí)現(xiàn)把數(shù)組按指定的個(gè)數(shù)分隔
這篇文章主要介紹了php實(shí)現(xiàn)把數(shù)組按指定的個(gè)數(shù)分隔。需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-02-02
php格式化時(shí)間戳顯示友好的時(shí)間實(shí)現(xiàn)思路及代碼
顯示為2014-10-20 10:22顯得很呆板,那么用php怎么實(shí)現(xiàn)友好的時(shí)間格式呢?下面將思路與實(shí)現(xiàn)代碼與大家分享下2014-10-10
PHP實(shí)現(xiàn)刪除非站內(nèi)外部鏈接實(shí)例代碼
一般在做網(wǎng)站系統(tǒng)的時(shí)候,出于優(yōu)化等因素的考慮需要再添加文章的時(shí)候刪除掉不是本站的鏈接,對(duì)于這一要求可以通過(guò)讓PHP處理下文章內(nèi)容,來(lái)達(dá)到文章外部鏈接的自動(dòng)刪除的效果。需要的朋友可以參考下2014-06-06

