如果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)
if (…)
。 - Gumbovar_dump()
,以查看是否isset()
现在确切地执行了empty()
的功能,但是结果一个为true
,另一个为false
,而且它们的操作码完全相同... - rid