加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP编程:PHP之autoload运行机制实例分析

发布时间:2020-12-13 02:00:51 所属栏目:PHP教程 来源:网络整理
导读:《PHP之autoload运行机制实例分析》要点: 本文介绍了PHP之autoload运行机制实例分析,希望对您有用。如果有疑问,可以联系我们。 PHP实例 本文较为深入的分析了PHP的autoload运行机制.对于深入理解PHP运行原理有一定的赞助作用.具体分析如下: PHP实例 php

《PHP之autoload运行机制实例分析》要点:
本文介绍了PHP之autoload运行机制实例分析,希望对您有用。如果有疑问,可以联系我们。

PHP实例本文较为深入的分析了PHP的autoload运行机制.对于深入理解PHP运行原理有一定的赞助作用.具体分析如下:

PHP实例php实现autoload有两种办法:

PHP实例1、拦截器__autoload()

PHP实例2、设置全局变量函数指针autoload_func为指定函数.通常在c扩展中使用

PHP实例本质上前者还是通过后者实现的.

PHP实例分析过程,PHP5.3.6源码:

PHP实例=>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

PHP实例顾名思义,zend_call_function的主要功能是调用PHP函数.其参数fcall_info,fcall_cache,分别指向两个重要的结构,zend_fcall_info和zend_fcall_info_cache

PHP实例zend_call_function主要工作流程如下:

PHP实例如果fcall_cache.function_handler不为NULL,则直接执行 fcall_cache.function_handler指向的函数.
如果 fcall_cache.function_handler为NULL,则尝试查找函数名为fcall_info.function_name的函 数,如果存在的话,则执行之;
?
现总结如下,autoload机制的主要执行过程为:

PHP实例(1) 检查执行器全局变量函数指针autoload_func是否为NULL.
(2) 如果autoload_func不为NULL,则直接执行autoload_func指针指向的函数用来加载类,并不检查__autoload()函数是否定义.
(3) 如果autoload_func为NULL,则查找系统中是否定义有__autoload()函数.如果没有定义,则报告错误并退出;如果定义了__autoload()函数,则执行__autoload()尝试加载类,并返回加载结果.

PHP实例自动加载方便了面向对象和代码复用,但是多个类库不同的__autoload又会导致混乱.可以用spl_autoload办理,将不同开发者的拦截器函数都注册到自动加载函数的hashtable中.spl实现自动加载的机制是维护一个hashtable,里面存储有具有自动加载功能的各个函数.

PHP实例当触发自动加载机制时,zend会在遍历执行这个hashtable里面的函数,直到成功加载类或加载失败后返回.
当需要使用自动加载功能时,使用函数spl_autoload_register()或spl_autoload_register('autoloadfuncitonname')
无参的spl_autoload_register()会默认加载spl_autoload()函数,该函数功能有限,只能在inlcude_path中搜索指定扩展名的类库.

PHP实例有参的spl_autoload_register()默认不再加载spl_autoload()函数.
可以通过spl_autoload_functions()查看当前自动加载hashtable中的函数,该函数返回一个数组

PHP实例注意:使用spl_autoload时,系统会忽略拦截器__autoload,除非显式地使用spl_autoload_register('__autoload')将其加入hashtable

PHP实例希望本文所述对大家的PHP程序设计有所赞助

《PHP之autoload运行机制实例分析》是否对您有启发,欢迎查看更多与《PHP之autoload运行机制实例分析》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读