PHP之a(chǎn)utoload運行機制實例分析
本文較為深入的分析了PHP的autoload運行機制。對于深入理解PHP運行原理有一定的幫助作用。具體分析如下:
php實現(xiàn)autoload有兩種方法:
1、攔截器__autoload()
2、設(shè)置全局變量函數(shù)指針autoload_func為指定函數(shù)。通常在c擴展中使用
本質(zhì)上前者還是通過后者實現(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,分別指向兩個重要的結(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機制的主要執(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ù)。如果沒有定義,則報告錯誤并退出;如果定義了__autoload()函數(shù),則執(zhí)行__autoload()嘗試加載類,并返回加載結(jié)果。
自動加載方便了面向?qū)ο蠛痛a復(fù)用,但是多個類庫不同的__autoload又會導(dǎo)致混亂??梢杂胹pl_autoload解決,將不同開發(fā)者的攔截器函數(shù)都注冊到自動加載函數(shù)的hashtable中。spl實現(xiàn)自動加載的機制是維護(hù)一個hashtable,里面存儲有具有自動加載功能的各個函數(shù)。
當(dāng)觸發(fā)自動加載機制時,zend會在遍歷執(zhí)行這個hashtable里面的函數(shù),直到成功加載類或加載失敗后返回。
當(dāng)需要使用自動加載功能時,使用函數(shù)spl_autoload_register()或spl_autoload_register('autoloadfuncitonname')
無參的spl_autoload_register()會默認(rèn)加載spl_autoload()函數(shù),該函數(shù)功能有限,只能在inlcude_path中搜索指定擴展名的類庫。
有參的spl_autoload_register()默認(rèn)不再加載spl_autoload()函數(shù)。
可以通過spl_autoload_functions()查看當(dāng)前自動加載hashtable中的函數(shù),該函數(shù)返回一個數(shù)組
注意:使用spl_autoload時,系統(tǒng)會忽略攔截器__autoload,除非顯式地使用spl_autoload_register('__autoload')將其加入hashtable
希望本文所述對大家的PHP程序設(shè)計有所幫助
- PHP中spl_autoload_register()和__autoload()區(qū)別分析
- PHP中spl_autoload_register函數(shù)的用法總結(jié)
- PHP函數(shù)spl_autoload_register()用法和__autoload()介紹
- PHP spl_autoload_register實現(xiàn)自動加載研究
- PHP中__autoload和Smarty沖突的簡單解決方法
- thinkphp autoload 命名空間自定義 namespace
- php中spl_autoload詳解
- PHP中spl_autoload_register()函數(shù)用法實例詳解
相關(guān)文章
php中使用exec,system等函數(shù)調(diào)用系統(tǒng)命令的方法(不建議使用,可導(dǎo)致安全問題)
PHP作為一種服務(wù)器端的腳本語言,像編寫簡單,或者是復(fù)雜的動態(tài)網(wǎng)頁這樣的任務(wù),它完全能夠勝任。但事情不總是如此,有時為了實現(xiàn)某個功能,必須借助于操作系統(tǒng)的外部程序(或者稱之為命令),這樣可以做到事半功倍2012-09-09PHP提取數(shù)據(jù)庫內(nèi)容中的圖片地址并循環(huán)輸出
PHP利用正則提取數(shù)據(jù)庫內(nèi)容中的圖片地址循環(huán)輸出的實現(xiàn)代碼。2010-03-03PHP基于GD2函數(shù)庫實現(xiàn)驗證碼功能示例
這篇文章主要介紹了PHP基于GD2函數(shù)庫實現(xiàn)驗證碼功能,簡單介紹了GD2函數(shù)庫的常用函數(shù),并結(jié)合實例形式分析了php實現(xiàn)驗證碼功能相關(guān)操作技巧,需要的朋友可以參考下2019-01-01用mysql內(nèi)存表來代替php session的類
mysql內(nèi)存表實現(xiàn)替換php session類,效果什么大家可以自己測試下。2009-02-02PHP中遍歷stdclass object的實現(xiàn)代碼
從網(wǎng)上查到的方法是 用get_object_vars 把類類型轉(zhuǎn)換成數(shù)組 然后在用 foreach 遍歷即可2011-06-06php中g(shù)et_object_vars()在數(shù)組的實例用法
在本篇文章小編給大家整理的是一篇關(guān)于php中g(shù)et_object_vars()在數(shù)組的實例用法,對此有興趣的朋友們可以學(xué)習(xí)下。2021-02-02