PHP之autoload运行机制实例分析

2015-01-24信息快讯网

这篇文章主要介绍了PHP的autoload运行机制分析,从PHP源码及应用的角度对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中$_POST与php://input的区别实例分析
php实现utf-8转unicode函数分享
php使用fputcsv()函数csv文件读写数据的方法
phplot生成图片类用法详解
ioncube_loader_win_5.2.dll的错误解决方法
php+jQuery.uploadify实现文件上传教程
CentOS6.5 编译安装lnmp环境
php提示Failed to write session data错误的解决方法
php运行提示:Fatal error Allowed memory size内存不足的解决方法
PHP使用glob函数遍历目录或文件夹的方法
phpstorm配置Xdebug进行调试PHP教程
phpstorm编辑器乱码问题解决
PHP集成百度Ueditor 1.4.3
PHP检测字符串是否为UTF8编码的常用方法
php中filter_input函数用法分析
php中spl_autoload详解
PHP实现数组递归转义的方法
php+MySQL判断update语句是否执行成功的方法
destoon出现验证码不显示时的紧急处理方法
destoon供应信息title调用出公司名称的方法
destoon实现不同会员组公司名称显示不同的颜色的方法
destoon文章模块调用企业会员资料的方法
destoon实现会员商铺中指定会员或会员组投放广告的方法
destoon切换城市后实现logo旁边显示地区名称的方法
PHP中使用localhost连接Mysql不成功的解决方法
深入理解PHP中的global
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
php中隐形字符65279(utf-8的BOM头)问题
phpmyadmin出现Cannot start session without errors问题解决方法
Linux下创建nginx脚本-start、stop、reload…
完美的2个php检测字符串是否是utf-8编码函数分享
ThinkPHP权限认证Auth实例详解
PHP中spl_autoload_register()和__autoload()区别分析
©2014-2024 dbsqp.com