使用源,卢克
像往常一样,答案在于源头。 PHP在内部使用以下两个函数来执行增量和减量操作:
这些操作根据其类型修改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中,但该变量绝对不会更新。
这不是一个错误(tm)
你可能会惊讶地知道,这种行为,包括布尔值,实际上是documented:
Note: The increment/decrement operators do not affect boolean values. Decrementing NULL values has no effect too, but incrementing them results in 1.
关于布尔:
$a = true;
var_dump($a--); // true
$a = false;
var_dump($a++); // false
关于字符串:
$letter = 'A';
var_dump(++$letter); // B
var_dump(--$letter); // B