《PHP編程:PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析》要點(diǎn):
本文介紹了PHP編程:PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析,希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
PHP實(shí)例本文較為深入的分析了PHP的autoload運(yùn)行機(jī)制.對(duì)于深入理解PHP運(yùn)行原理有一定的贊助作用.具體分析如下:
PHP實(shí)例php實(shí)現(xiàn)autoload有兩種辦法:
PHP實(shí)例1、攔截器__autoload()
PHP實(shí)例2、設(shè)置全局變量函數(shù)指針autoload_func為指定函數(shù).通常在c擴(kuò)展中使用
PHP實(shí)例本質(zhì)上前者還是通過后者實(shí)現(xiàn)的.
PHP實(shí)例分析過程,PHP5.3.6源碼:
PHP實(shí)例=>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
PHP實(shí)例顧名思義,zend_call_function的主要功能是調(diào)用PHP函數(shù).其參數(shù)fcall_info, fcall_cache,分別指向兩個(gè)重要的結(jié)構(gòu),zend_fcall_info和zend_fcall_info_cache
PHP實(shí)例zend_call_function主要工作流程如下:
PHP實(shí)例如果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í)行過程為:
PHP實(shí)例(1) 檢查執(zhí)行器全局變量函數(shù)指針autoload_func是否為NULL.
(2) 如果autoload_func不為NULL,則直接執(zhí)行autoload_func指針指向的函數(shù)用來加載類,并不檢查__autoload()函數(shù)是否定義.
(3) 如果autoload_func為NULL,則查找系統(tǒng)中是否定義有__autoload()函數(shù).如果沒有定義,則報(bào)告錯(cuò)誤并退出;如果定義了__autoload()函數(shù),則執(zhí)行__autoload()嘗試加載類,并返回加載結(jié)果.
PHP實(shí)例自動(dòng)加載方便了面向?qū)ο蠛痛a復(fù)用,但是多個(gè)類庫(kù)不同的__autoload又會(huì)導(dǎo)致混亂.可以用spl_autoload辦理,將不同開發(fā)者的攔截器函數(shù)都注冊(cè)到自動(dòng)加載函數(shù)的hashtable中.spl實(shí)現(xiàn)自動(dòng)加載的機(jī)制是維護(hù)一個(gè)hashtable,里面存儲(chǔ)有具有自動(dòng)加載功能的各個(gè)函數(shù).
PHP實(shí)例當(dāng)觸發(fā)自動(dòng)加載機(jī)制時(shí),zend會(huì)在遍歷執(zhí)行這個(gè)hashtable里面的函數(shù),直到成功加載類或加載失敗后返回.
當(dāng)需要使用自動(dòng)加載功能時(shí),使用函數(shù)spl_autoload_register()或spl_autoload_register('autoloadfuncitonname')
無參的spl_autoload_register()會(huì)默認(rèn)加載spl_autoload()函數(shù),該函數(shù)功能有限,只能在inlcude_path中搜索指定擴(kuò)展名的類庫(kù).
PHP實(shí)例有參的spl_autoload_register()默認(rèn)不再加載spl_autoload()函數(shù).
可以通過spl_autoload_functions()查看當(dāng)前自動(dòng)加載hashtable中的函數(shù),該函數(shù)返回一個(gè)數(shù)組
PHP實(shí)例注意:使用spl_autoload時(shí),系統(tǒng)會(huì)忽略攔截器__autoload,除非顯式地使用spl_autoload_register('__autoload')將其加入hashtable
PHP實(shí)例希望本文所述對(duì)大家的PHP程序設(shè)計(jì)有所贊助
《PHP編程:PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析》是否對(duì)您有啟發(fā),歡迎查看更多與《PHP編程:PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析》相關(guān)教程,學(xué)精學(xué)透。維易PHP學(xué)院為您提供精彩教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/14775.html