gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:48:01 25 4
gpt4 key购买 nike

如果 isset()empty() 生成完全相同的 ISSET_ISEMPTY_DIM_OBJ 操作码,PHP VM 如何区分两者之间的区别两个?

这段代码:

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对于 emptyZEND_ISSET对于 isset .

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

如果您查看 full opcodes ,您会看到这些常量为 1 ( ZEND_ISSET = (1<<0) ) 和 2 ( ZEND_ISEMPTY = (1<<1) ) 在 ext 中专栏。

关于php - 为什么 isset() 和 empty() 使用相同的操作码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6237397/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com