PHP unterstützt Prä- und Post-Inkrement- und Dekrementoperatoren. Diese unären (einstelligen) Operatoren ermöglichen es, einen Wert um eins zu erhöhen oder zu verringern.
Beispiel | Name | Auswirkung |
---|---|---|
++$a | Prä-Inkrement | Erhöht $a um eins und gibt dann $a zurück. |
$a++ | Post-Inkrement | Gibt $a zurück und erhöht $a dann um eins. |
--$a | Prä-Dekrement | Vermindert $a um eins, und gibt dann $a zurück. |
$a-- | Post-Dekrement | Gibt $a zurück, und vermindert $a dann um eins. |
Ein einfaches Beispiel-Skript:
<?php
echo "Post-Inkrement", PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);
echo "Prä-Inkrement", PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);
echo "Post-Dekrement", PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);
echo "Prä-Dekrement", PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
Post-Inkrement: int(5) int(6) Prä-Inkrement: int(6) int(6) Post-Dekrement: int(5) int(4) Prä-Dekrement: int(4) int(4)
Die Inkrement- und Dekrement-Operatoren wirken sich nicht auf Werte vom
Typ bool aus. Seit PHP 8.3.0 wird ein
E_WARNING
ausgegeben, weil der Wert dadurch in
Zukunft implizit in int umgewandelt wird.
Der Dekrement-Operator wirkt sich nicht auf Werte vom
Typ null aus. Seit PHP 8.3.0 wird ein
E_WARNING
ausgegeben, weil der Wert dadurch in
Zukunft implizit in int umgewandelt wird.
Der Dekrement-Operator wirkt sich nicht auf
nicht-numerische Zeichenketten.
aus Seit PHP 8.3.0 wird ein E_WARNING
ausgegeben,
weil in Zukunft ein TypeError geworfen wird.
Hinweis:
Interne Objekte, die das Überladen von Addition und/oder Subtraktion unterstützen, können ebenfalls inkrementiert und/oder dekrementiert werden. Ein solches internes Objekt ist GMP.
Diese Funktionalität ist seit PHP 8.3.0 veraltet (soft-deprecated). Stattdessen sollte die Funktion str_increment() verwendet werden.
In PHP ist es möglich, eine
nicht-numerische Zeichenkette
zu inkrementieren, sofern es sich um eine alphanumerische ASCII-Zeichenkette
handelt. Dabei werden die Buchstaben bis zum nächsten Buchstaben
hochgezählt, und bei Erreichen des Buchstabens Z
wird die
Inkrementierung auf den Wert auf der linken Seite übertragen. Beispielsweise
verwandelt $a = 'Z'; $a++;
$a in
'AA'
.
Beispiel #1 Beispiel für die Inkrementierung von Zeichenketten im PERL-Stil
<?php
echo '== Zeichenketten aus Buchstaben ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// Alphanumerische Zeichenketten verhalten sich anders
echo '== Alphanumerische Zeichenketten ==' . PHP_EOL;
$d = 'A8';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
$d = 'A08';
for ($n=0; $n<6; $n++) {
echo ++$d . PHP_EOL;
}
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
== Zeichenketten aus Buchstaben == X Y Z AA AB AC == Alphanumerische Zeichenketten == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14
Wenn eine alphanumerische Zeichenkette als numerische Zeichenkette interpretiert werden kann, wird sie in den Typ int oder float umgewandelt. Dies ist vor allem bei Zeichenketten ein Problem, die aussehen wie Gleitkommazahlen in Exponentialschreibweise. Die Funktion str_increment() nimmt diese impliziten Typumwandlungen nicht vor.
Beispiel #2 Umwandlung einer alphanumerischen Zeichenkette in eine Gleitkommazahl
<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
?>
Das oben gezeigte Beispiel erzeugt folgende Ausgabe:
string(3) "5e0" float(6)
Das liegt daran, dass der Wert "5e0"
als
float interpretiert und in den Wert 5.0
umgewandelt wird, bevor er inkrementiert wird.