您好,欢迎访问一九零五行业门户网

语法:IF判断的实现

面试php时经常碰到一种判断各种类型的空值是否为true的题:
$a = '';$a = null$a = false;if($a){...}if(isset($a)){...}if(empty($a)){...}...
由下面的例子我们来简单看下zend引擎中对if是怎么处理的:
op1.var); if (z_type_info_p(val) == is_true) { zend_vm_set_next_opcode(opline + 1); zend_vm_continue(); } elseif (expected(z_type_info_p(val) if (is_cv == is_cv && unexpected(z_type_info_p(val) == is_undef)) { save_opline(); get_op1_undef_cv(val, bp_var_r); zend_vm_jmp(op_jmp_addr(opline, opline->op2)); } else { zend_vm_set_opcode(op_jmp_addr(opline, opline->op2)); zend_vm_continue(); } } save_opline(); if (i_zend_is_true(val)) { opline++; } else { opline = op_jmp_addr(opline, opline->op2); } if (unexpected(eg(exception) != null)) { handle_exception(); } zend_vm_jmp(opline);}
从这个函数可以看出if的执行过程:如果条件为true的话则opline++,顺序执行下一条opcode(即if内语句),否则进行跳转,跳过if内语句直接执行if外语句。
i_zend_is_true这个函数就是用来判断各种类型的值是否为真,前面那部分是判断是否为bool型,是的话则直接处理。
//zend_operators.h #283static zend_always_inline int i_zend_is_true(zval *op){ int result = 0;again: switch (z_type_p(op)) { caseis_true: result = 1; break; //数值类型long、double直接判断即可,与c用法相同 caseis_long: if (z_lval_p(op)) { result = 1; } break; caseis_double: if (z_dval_p(op)) { result = 1; } break; //字符串类型根据长度判断:长度>1,或=1且不为'0'为true,所以上面那个例子'' =>falsecaseis_string: if (z_strlen_p(op) > 1 || (z_strlen_p(op) && z_strval_p(op)[0] != '0')) { result = 1; } break; //数组类型根据数组元素的个数判断:大于0即为真 caseis_array: if(zend_hash_num_elements(z_arrval_p(op))) { // (z_arrval_p(op))->nnumofelements result = 1; } break; caseis_object: result = zend_object_is_true(op); break; //资源类型实际就是整形(后续会专门介绍资源类型),所以直接判断即可 caseis_resource: if (expected(z_res_handle_p(op))) { result = 1; } break; //引用类型则根据指向的值判断 caseis_reference: op = z_refval_p(op); goto again; break; default: break; } return result;}
isset、empty函数后续补充……
').addclass('pre-numbering').hide(); $(this).addclass('has-numbering').parent().append($numbering); for (i = 1; i ').text(i)); }; $numbering.fadein(1700); }); }); 以上就介绍了语法:if判断的实现,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息