i have tried code
$a = array_fill(0, 4, null); $a[0]++; ++$a[1]; $a[2]--; --$a[3]; var_dump($a); result:
array(4) { [0]=> int(1) [1]=> int(1) [2]=> null [3]=> null } why value of 2 , 3 index not negative?
use source, luke
as usual, answer lies in source. php uses following 2 functions internally perform increment , decrement operations:
zend_api int increment_function(zval *op1)
zend_api int decrement_function(zval *op1)
these operations modify op1 argument based on type (null type); inside increment_function() can see following branch in code:
case is_null: zval_long(op1, 1); break; the above code changes type of op1 number , sets value 1.
conversely, decrement_function() offers no such branch , therefore default action performed:
default: return failure; running code won't yield observable failure, because return values absorbed in zend vm, variable isn't updated either.
it's not bug(tm)
you may surprised know behaviour, including boolean values, documented:
note: increment/decrement operators not affect boolean values. decrementing
nullvalues has no effect too, incrementing them results in1.
regarding booleans:
$a = true; var_dump($a--); // true $a = false; var_dump($a++); // false regarding strings:
$letter = 'a'; var_dump(++$letter); // b var_dump(--$letter); // b
Comments
Post a Comment