die Quelle verwenden, Luke
Wie üblich liegt die Antwort in der Quelle. PHP verwendet die folgenden beiden Funktionen intern die Inkrement- und Dekrement-Operationen auszuführen:
ZEND_API int increment_function(zval *op1)
ZEND_API int decrement_function(zval *op1)
Diese Operationen das op1
Argument modifizieren, basierend auf ihrem Typ (NULL
ist ein Typ);
case IS_NULL:
ZVAL_LONG(op1, 1);
break;
Der obige Code ändert sich die Art der op1
in eine Reihe und setzt den Wert auf 1
: innerhalb increment_function()
können Sie den folgenden Zweig in the code sehen.
Umgekehrt decrement_function()
bietet keine solche Niederlassung und damit die default action wird ausgeführt:
default:
return FAILURE;
diesen Code ausführen, werden eigentlich keine feststellbaren Fehler ergeben, da die Rückgabewerte in der Zend VM absorbiert werden, aber Die Variable wird definitiv auch nicht aktualisiert.
Es ist kein Bug (tm)
Sie überrascht, dass dieses Verhalten zu wissen sein, einschließlich, dass für Boolesche Werte, ist eigentlich documented:
Hinweis: Der Zuwachs/Dekrementoperatoren wirken sich nicht auf boolesche Werte aus. Die Dekrementierung der NULL
Werte hat keine Auswirkungen, aber die Erhöhung der Werte führt zu 1
.
In Bezug auf booleans:
$a = true;
var_dump($a--); // true
$a = false;
var_dump($a++); // false
In Bezug auf Strings:
$letter = 'A';
var_dump(++$letter); // B
var_dump(--$letter); // B
Warum erwarten Sie die _index_ negativ zu gehen? Die _values_ gehen nicht negativ, weil 'NULL' in PHP wirklich seltsam ist. Es hat nichts mit der losen Typologie der Sprache zu tun. – Bojangles
Das OP erwartet nicht, dass _index_ negativ ist, sondern die von diesen Indizes angegebenen Werte. – marekful
das ist ein Kandidat für die Aufnahme auf http://phpsadness.com/. – SirDarius