PHP之autoload运行机制实例分析 |
本文较为深入的分析了PHP的autoload运行机制 。对于深入理解PHP运行原理有一定的帮助作用 。具体分析如下: php实现autoload有两种方法: 1、拦截器__autoload() 2、设置全局变量函数指针autoload_func为指定函数 。通常在c扩展中使用 本质上前者还是通过后者实现的 。 分析过程,PHP5.3.6源码: =>Zend/zend_vm_def.h 1894行 顾名思义,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指向的函数 。 (1) 检查执行器全局变量函数指针autoload_func是否为NULL 。 自动加载方便了面向对象和代码复用,但是多个类库不同的__autoload又会导致混乱 。可以用spl_autoload解决,将不同开发者的拦截器函数都注册到自动加载函数的hashtable中 。spl实现自动加载的机制是维护一个hashtable,里面存储有具有自动加载功能的各个函数 。 当触发自动加载机制时,zend会在遍历执行这个hashtable里面的函数,直到成功加载类或加载失败后返回 。 有参的spl_autoload_register()默认不再加载spl_autoload()函数 。 注意:使用spl_autoload时,系统会忽略拦截器__autoload,除非显式地使用spl_autoload_register(__autoload)将其加入hashtable 希望本文所述对大家的PHP程序设计有所帮助 |