CascadiaPHP 2024

Inkrement- bzw. Dekrementoperatoren

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.

Inkrement- und Dekrementoperatoren
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)
Warnung

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.

Inkrementieren von Zeichenketten im PERL-Stil

Warnung

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
Warnung

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.

add a note

User Contributed Notes 1 note

up
72
hartmut at php dot net
11 years ago
Note that

$a="9D9"; var_dump(++$a); => string(3) "9E0"

but counting onwards from there

$a="9E0"; var_dump(++$a); => float(10)

this is due to "9E0" being interpreted as a string representation of the float constant 9E0 (or 9e0), and thus evalutes to 9 * 10^0 = 9 (in a float context)
To Top