为什么isset()和empty()都使用相同的操作码?

rid*_*rid 10 php

如果同时isset()empty()产生完全相同的ISSET_ISEMPTY_DIM_OBJ操作码,怎么能PHP VM分辨出两者之间的区别?

这段代码:

empty($a['b']);
isset($a['b']);
Run Code Online (Sandbox Code Playgroud)

产生以下操作码:

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
Run Code Online (Sandbox Code Playgroud)

另一个测试:

if (empty($a['b'])) {
    echo 'abc';
}

if (isset($a['b'])) {
    echo 'abc';
}
Run Code Online (Sandbox Code Playgroud)

这会产生:

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)
Run Code Online (Sandbox Code Playgroud)

Nik*_*kiC 5

无论你使用什么工具来创建操作码转储,它只告诉你一半的事实:它忘了提到PHP正在向该操作码传递一个常量,具体取决于使用的语言结构.这些常数是ZEND_ISEMPTY为了emptyZEND_ISSETisset.

你可以在这里这里找到调用.(这里的类型被放入extended_value操作码中.)

如果查看完整的操作码,您会在列中看到这些常量为1(ZEND_ISSET = (1<<0))和2(ZEND_ISEMPTY = (1<<1))ext.