一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

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ì)上前者還是通過后者實(shí)現(xiàn)的。

分析過程,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í)行過程為:

(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é)果。

自動(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ù)。

當(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')
無(wú)參的spl_autoload_register()會(huì)默認(rèn)加載spl_autoload()函數(shù),該函數(shù)功能有限,只能在inlcude_path中搜索指定擴(kuò)展名的類庫(kù)。

有參的spl_autoload_register()默認(rèn)不再加載spl_autoload()函數(shù)。
可以通過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技術(shù)PHP之a(chǎn)utoload運(yùn)行機(jī)制實(shí)例分析,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 精品视频在线免费观看 | 亚洲小说区图片区另类春色 | 手机在线成人精品视频网 | 色免费看 | 怡红院精品视频 | 欧美精品亚洲二区 | 亚洲免费二区三区 | 日韩色视| 国产一区二区三区毛片 | 91在线播放免费不卡无毒 | 免费精品国产自产拍在 | 中文字幕日产每天更新40 | 久久中文字幕一区二区三区 | 欧美亚洲激情在线 | 被公侵犯肉体中文字幕一区二区 | 免费成人小视频 | xxxx8888免费看的视频 | 日本精品一区二区在线播放 | 国产免费久久精品99久久 | 国内精品久久久久久不卡影院 | 亚洲欧美日韩国产精品第不页 | 国产精品自产拍视频观看 | 国产美女无遮挡免费视频 | 国产福利精品在线 | 91精品视频免费观看 | 92看片淫黄大片欧美看国产片 | 一区二区三区高清在线观看 | 亚洲香蕉伊在人在线观看9 亚洲香蕉伊综合在人在线 亚洲香蕉影院 | 91精品福利一区二区 | 婷婷丁香在线观看 | 激情在线视频 | 久草中文在线视频 | 国产欧美成人 | 久久麻豆亚洲精品 | 大量国产激情视频在线观看 | 欧美成人全部免费观看1314色 | 亚洲精品午夜视频 | 婷婷六月丁 | 欧美一级特黄视频 | 久久综合视频网站 | 免费国产午夜高清在线视频 |