我已经尝试过此代码
$a = array_fill(0, 4, NULL);
$a[0]++;
++$a[1];
$a[2]--;
--$a[3];
var_dump($a);
结果:
array(4) {
[0]=> int(1)
[1]=> int(1)
[2]=> NULL
[3]=> NULL
}
为什么2和3索引的值不为负?
最佳答案
使用Luke来源
像往常一样,答案就在源头。 PHP内部使用以下两个函数来执行递增和递减操作:
ZEND_API int increment_function(zval *op1)
ZEND_API int decrement_function(zval *op1)
这些操作根据其类型修改op1
参数(NULL
是一种类型);在increment_function()
内,您可以看到以下分支in the code:
case IS_NULL:
ZVAL_LONG(op1, 1);
break;
上面的代码将
op1
的类型更改为数字,并将其值设置为1
。相反,
decrement_function()
不提供此类分支,因此将执行default action:default:
return FAILURE;
运行此代码实际上不会产生任何可观察到的失败,因为返回值已存储在Zend VM中,但是该变量也绝对不会更新。
这不是bug(tm)
您可能会惊讶地发现,这种行为(包括 bool 值的行为)实际上是documented:
关于 bool 值:
$a = true;
var_dump($a--); // true
$a = false;
var_dump($a++); // false
关于字符串:
$letter = 'A';
var_dump(++$letter); // B
var_dump(--$letter); // B
关于php - 为什么在此数组中递减NULL而不是负数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17592559/