php – 这两个isset()和empty()如何使用相同的操作码?

前端之家收集整理的这篇文章主要介绍了php – 这两个isset()和empty()如何使用相同的操作码?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果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.

您可以找到调用herehere.(而且here的类型被放入操作码的extended_value中.)

如果您查看full opcodes,您将在ext列中看到那些常数为1(ZEND_ISSET =(1 <))和2(ZEND_ISEMPTY =(1 <1)).

原文链接:https://www.f2er.com/php/133026.html

猜你在找的PHP相关文章