加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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)).

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读