php – 这两个isset()和empty()如何使用相同的操作码?
发布时间:2020-12-13 16:01:38 所属栏目:PHP教程 来源:网络整理
导读:如果isset()和empty()都生成完全相同的ISSET_ISEMPTY_DIM_OBJ操作码,那么 PHP虚拟机如何分辨两者之间的区别呢? 这段代码: empty($a['b']);isset($a['b']); 生成以下操作码: ISSET_ISEMPTY_DIM_OBJ $a,b - TMP_VAR 0FREE TMP_VAR 0ISSET_ISEMPTY_DIM_OBJ $
如果isset()和empty()都生成完全相同的ISSET_ISEMPTY_DIM_OBJ操作码,那么
PHP虚拟机如何分辨两者之间的区别呢?
这段代码: empty($a['b']); isset($a['b']); 生成以下操作码: ISSET_ISEMPTY_DIM_OBJ $a,b -> TMP_VAR 0 FREE TMP_VAR 0 ISSET_ISEMPTY_DIM_OBJ $a,b -> TMP_VAR 1 FREE TMP_VAR 1 另一个测试: if (empty($a['b'])) { echo 'abc'; } if (isset($a['b'])) { echo 'abc'; } 这产生: ISSET_ISEMPTY_DIM_OBJ $a,b -> TMP_VAR 0 JMPZ TMP_VAR 0,&(BC4E00+4) ECHO abc JMP &(BC4E00+4) ISSET_ISEMPTY_DIM_OBJ $a,b -> TMP_VAR 1 JMPZ TMP_VAR 1,&(BC4FE0+8) ECHO abc JMP &(BC4FE0+8)
无论您使用哪种工具来创建该操作码转储,它只告诉您一半事实:它忘记提到PHP根据使用哪种语言构造将常量传递给该操作码.那些常量是空的ZEND_ISEMPTY和用于isset的ZEND_ISSET.
您可以找到调用here和here.(而且here的类型被放入操作码的extended_value中.) 如果您查看full opcodes,您将在ext列中看到那些常数为1(ZEND_ISSET =(1 <))和2(ZEND_ISEMPTY =(1 <1)). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |