我已经尝试过此代码

$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/

10-15 12:17