程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP之autoload運行機制實例分析,autoload實例分析

PHP之autoload運行機制實例分析,autoload實例分析

編輯:關於PHP編程

PHP之autoload運行機制實例分析,autoload實例分析


本文較為深入的分析了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程序設計有所幫助


php中__autoload()加載問題

給你分享個我在用的吧
//自動掛載類function AutoLoad($classname){ // class類 $filepath = BASE_CLASS . $classname . '.class.php'; if (file_exists($filepath)) { return include $filepath; } //lib庫文件 $filepath = BASE_LIB . $classname . '.lib.php'; if (file_exists($filepath)) { return include $filepath; }}spl_autoload_register('AutoLoad');用法:
//檢查登錄User::is_loginin();//自動實例化User,並執行is_loginin
 

急,各位高人解釋一下PHP中的__autoload函數以及spl_autoload_register()函數,我到網上找資料都沒看懂

__autoload 常用在自動加載類庫處理
也就是網上說的 這種方法,根據類名,找出類文件,然後require_one
spl_autoload_register()

__autoload的最大缺陷是無法有多個autoload方法

好了, 想下下面的這個情景,你的項目引用了別人的一個項目,你的項目中有一個__autoload,別人的項目也有一個__autoload,這樣兩個__autoload就沖突了。解決的辦法就是修改__autoload成為一個,這無疑是非常繁瑣的。

因此我們急需使用一個autoload調用堆棧,這樣spl的autoload系列函數就出現了。你可以使用spl_autoload_register注冊多個自定義的autoload函數

如果你的PHP版本大於5.1的話,你就可以使用spl_autoload
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved