PHP之autoload運行機制執行個體分析_php技巧

來源:互聯網
上載者:User

本文較為深入的分析了PHP的autoload運行機制。對於深入理解PHP運行原理有一定的協助作用。具體分析如下:

php實現autoload有兩種方法:

1、攔截器__autoload()

2、設定全域變數函數指標autoload_func為指定函數。通常在c擴充中使用

本質上前者還是通過後者實現的。

分析過程,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的主要功能是調用PHP函數。其參數fcall_info, fcall_cache,分別指向兩個重要的結構,zend_fcall_info和zend_fcall_info_cache

zend_call_function主要工作流程如下:

如果fcall_cache.function_handler不為NULL,則直接執行 fcall_cache.function_handler指向的函數。
如果 fcall_cache.function_handler為NULL,則嘗試尋找函數名為fcall_info.function_name的函 數,如果存在的話,則執行之;
 
現總結如下,autoload機制的主要執行過程為:

(1) 檢查執行器全域變數函數指標autoload_func是否為NULL。
(2) 如果autoload_func不為NULL,則直接執行autoload_func指標指向的函數用來載入類,並不檢查__autoload()函數是否定義。
(3) 如果autoload_func為NULL,則尋找系統中是否定義有__autoload()函數。如果沒有定義,則報告錯誤並退出;如果定義了__autoload()函數,則執行__autoload()嘗試載入類,並返回載入結果。

自動載入方便了物件導向和代碼複用,但是多個類庫不同的__autoload又會導致混亂。可以用spl_autoload解決,將不同開發人員的攔截器函數都註冊到自動載入函數的hashtable中。spl實現自動載入的機制是維護一個hashtable,裡面儲存有具有自動載入功能的各個函數。

當觸發自動載入機制時,zend會在遍曆執行這個hashtable裡面的函數,直到成功載入類或載入失敗後返回。
當需要使用自動載入功能時,使用函數spl_autoload_register()或spl_autoload_register('autoloadfuncitonname')
無參的spl_autoload_register()會預設載入spl_autoload()函數,該函數功能有限,只能在inlcude_path中搜尋指定副檔名的類庫。

有參的spl_autoload_register()預設不再載入spl_autoload()函數。
可以通過spl_autoload_functions()查看當前自動載入hashtable中的函數,該函數返回一個數組

注意:使用spl_autoload時,系統會忽略攔截器__autoload,除非顯式地使用spl_autoload_register('__autoload')將其加入hashtable

希望本文所述對大家的PHP程式設計有所協助

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.