走进php内核】之 选择结构(if,switch)

  • Post author:
  • Post category:php


选择结构

程序并不都是顺序执行的,选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。PHP中通过if、elseif、else和switch语句实现条件控制。这一节我们就分析下PHP中两种条件语句的具体实现。

if语句

If语句用法:

if(Condition1){
    Statement1;
}elseif(Condition2){
    Statement2;
}else{
    Statement3;
}

IF语句有两部分组成:condition(条件)、statement(声明),每个条件分支对应一组这样的组合,其中最后的else比较特殊,它没有条件,编译时也是按照这个逻辑编译为一组组的condition和statement,其具体的语法规则如下:

if_stmt:
        if_stmt_without_else %prec T_NOELSE { $$ = $1; }
    |   if_stmt_without_else T_ELSE statement 
            { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_IF_ELEM, NULL, $3)); }
;

if_stmt_without_else:
        T_IF '(' expr ')' statement { $$ = zend_ast_create_list(1, ZEND_AST_IF,
                                        zend_ast_create(ZEND_AST_IF_ELEM, $3, $5)); }
    |   if_stmt_without_else T_ELSEIF '(' expr ')' statement 
            { $$ = zend_ast_list_add($1, zend_ast_create(ZEND_AST_IF_ELEM, $4, $6)); }
;

从上面的语法规则可以看出,编译if语句时首先会创建一个ZEND_AST_IF的节点,这个节点是一个list,用于保存各个分支的condition、statement,编译每个分支时将创建一个ZEND_AST_IF_ELEM的节点,它有两个子节点,分别用来记录:condition、statement,然后把这个节点插入到ZEND_AST_IF下,最终生成的AST:

编译opcode时顺序编译每个分支的condition、statement即可,编译过程大致如下:


  • (1)

    编译当前分支的condition语句,这里可能会有多个条件,但最终会归并为一个true/false的结果;

  • (2)

    编译完conditio



版权声明:本文为u013756836原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。