• 技术文章 >后端开发 >php教程

    PHP之autoload运行机制实例分析_php技巧

    2016-05-16 20:36:43原创486
    本文较为深入的分析了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程序设计有所帮助

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:PHP autoload 运行 机制
    上一篇:PHP实现数组递归转义的方法_php技巧 下一篇:PHP高级编程实例:编写守护进程_php技巧
    VIP课程(WEB全栈开发)

    相关文章推荐

    • 【腾讯云】年中优惠,「专享618元」优惠券!• 20+值得了解的PHP面试题(附答案分析)• 【php】PHP.ini配置文件中文• PHP和MySQL入门(4)• PHP执行过程,php执行_PHP教程• PHP错误Warning:mysql_query()解决方法,warningmysql_query_PHP教程
    1/1

    PHP中文网