选择结构
程序并不都是顺序执行的,选择结构用于判断给定的条件,根据判断的结果来控制程序的流程。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 版权协议,转载请附上原文出处链接和本声明。