在本文中,PHP的自动运行机制进行了深入的分析,必须了解PHP原理的一些帮助。具体分析如下:

有两种方式来实现加载PHP:

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线。

如果(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是无效的,由fcall_cache.function_handler功能直接执行。

如果fcall_cache.function_handler是空的,试图找到一个函数名为fcall_info.function_name,如果它存在,它被执行。



本文的主要工作如下:对加载机制的主要执行过程如下:

(1)检查全局变量的函数的指针autoload_func的执行者是空的。

(2)如果autoload_func是无效的,由autoload_func指针的函数来加载类,而不检查是否__autoload()函数的定义。

(3)如果autoload_func是null,找出是否__autoload()函数是系统定义的。如果没有定义,错误报道和退出;如果__autoload()函数的定义,对__autoload执行()尝试加载类和返回结果的负荷。

自动加载有利于目标导向和代码重用,但不同的__autoload的类库,可以造成混乱。它可以解决spl_autoload,和不同开发商的拦截功能是在汽车荷载作用下哈希表注册。产品线实现自动加载机制是维持一个具有自动加载功能各种功能的哈希表。

当自动加载机制被触发,Zend是遍历函数内部哈希表直到类加载成功或负荷后负荷失败返回。

使用功能spl_autoload_register()()或spl_autoload_register('autoloadfuncitonname)时,你需要使用自动加载功能。

没有参考,spl_autoload_register()将加载spl_autoload()函数默认情况下,它的功能有限,只能寻找在inlcude_path指定扩展类库。

的spl_autoload()函数不再是默认的spl_autoload_register加载()。

你可以看看在当前的自动加载功能通过spl_autoload_functions哈希表(),它返回一个数组

注意:使用spl_autoload时,系统忽略了拦截__autoload除非spl_autoload_register('__autoload)是明确用于添加到哈希表

希望本文能对PHP程序设计中的每个人有所帮助。