函数的执行流程

3.3.3 函数的执行流程

(这里的函数指用户自定义的PHP函数,不含内部函数) 上一节我们介绍了zend执行引擎的几个关键步骤,也简单的介绍了函数的调用过程,这里再单独总结下:

  • 【初始化阶段】 这个阶段首先查找到函数的zend_function,普通function就是到EG(function_table)中查找,成员方法则先从EG(class_table)中找到zend_class_entry,然后再进一步在其function_table找到zend_function,接着就是根据zend_op_array新分配 zend_execute_data 结构并设置上下文切换的指针
  • 【参数传递阶段】 如果函数没有参数则跳过此步骤,有的话则会将函数所需参数传递到 初始化阶段 新分配的 zend_execute_data动态变量区
  • 【函数调用阶段】 这个步骤主要是做上下文切换,将执行器切换到调用的函数上,可以理解会在这个阶段递归调用zend_execute_ex函数实现call的过程(实际并一定是递归,默认是在while(1){...}中切换执行空间的,但如果我们在扩展中重定义了zend_execute_ex用来介入执行流程则就是递归调用)
  • 【函数执行阶段】 被调用函数内部的执行过程,首先是接收参数,然后开始执行opcode
  • 【函数返回阶段】 被调用函数执行完毕返回过程,将返回值传递给调用方的zend_execute_data变量区,然后释放zend_execute_data以及分配的局部变量,将上下文切换到调用前,回到调用的位置继续执行,这个实际是函数执行中的一部分,不算是独立的一个过程

接下来我们一个具体的例子详细分析下各个阶段的处理过程:

function my_function($a, $b = false, $c = "hi"){
    return $c;
}

$a = array();
$b = true;

my_function($a, $b);

主脚本、my_function的opcode为:

联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2024

备案号:京ICP备15003423号-3