PHP поддерживает префиксные и постфиксные операторы инкремента и декремента. Эти унарные операторы разрешают увеличивать или уменьшать значение на единицу.
Пример | Название | Действие |
---|---|---|
++$a | Префиксный инкремент | Увеличивает $a на единицу, затем возвращает значение $a. |
$a++ | Постфиксный инкремент | Возвращает значение $a, затем увеличивает $a на единицу. |
--$a | Префиксный декремент | Уменьшает $a на единицу, затем возвращает значение $a. |
$a-- | Постфиксный декремент | Возвращает значение $a, затем уменьшает $a на единицу. |
Приведём пример простого скрипта:
<?php
echo 'Постфиксный инкремент:', PHP_EOL;
$a = 5;
var_dump($a++);
var_dump($a);
echo 'Префиксный инкремент:', PHP_EOL;
$a = 5;
var_dump(++$a);
var_dump($a);
echo 'Постфиксный декремент:', PHP_EOL;
$a = 5;
var_dump($a--);
var_dump($a);
echo 'Префиксный декремент:', PHP_EOL;
$a = 5;
var_dump(--$a);
var_dump($a);
Результат выполнения приведённого примера:
Постфиксный инкремент: int(5) int(6) Префиксный инкремент: int(6) int(6) Постфиксный декремент: int(5) int(4) Префиксный декремент: int(4) int(4)
Операторы инкремента и декремента не влияют на логические значения (bool).
Начиная с PHP 8.3.0 вызывается ошибка уровня E_WARNING
,
потому что в будущем это будет неявно приведено к значению целого числа (int).
Оператор декремента не влияет на значения null.
Начиная с PHP 8.3.0 вызывается ошибка уровня E_WARNING
,
потому что в будущем это будет неявно приведено к значению целого числа (int).
Оператор декремента не влияет на не-
числовые строки.
Начиная с PHP 8.3.0 вызывается ошибка уровня E_WARNING
,
потому в будущем будет выбрасываться исключение TypeError.
Замечание:
Внутренние объекты, которые поддерживают перегрузку сложения и/или вычитания, могут также быть инкрементированы и/или декрементированы. Один такой внутренний объект — это GMP.
Начиная с PHP 8.3.0 эта функция мягко устарела. Вместо этого вызывают функцию str_increment().
В PHP можно инкрементировать не-
числовую строку.
Строка должна быть буквенно-цифровой последовательностью в кодировке ASCII.
Буквы увеличиваются до следующей буквы, при достижении буквы
Z
инкремент переносится в следующий разряд слева.
Например, выражение $a = 'Z'; $a++;
превратит значение переменной $a
в значение «AA»
.
Пример #1 Пример увеличения строки PERL
<?php
echo '== Буквенные строки ==' . PHP_EOL;
$s = 'W';
for ($n=0; $n<6; $n++) {
echo ++$s . PHP_EOL;
}
// Буквенно-цифровые строки ведут себя иначе
echo '== Буквенно-цифровые строки ==' . 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;
}
Результат выполнения приведённого примера:
== Буквенные строки == X Y Z AA AB AC == Буквенно-цифровые строки == A9 B0 B1 B2 B3 B4 A09 A10 A11 A12 A13 A14
Если буквенно-цифровая строка может быть интерпретирована как числовая строка, она будет приведена к типу int или float. Эта проблема встаёт особенно остро со строками, которые выглядят как числа с плавающей точкой, записанные в научной нотации. Функция str_increment() не страдает от эти неявных приведений типов.
Пример #2 Буквенно-цифровая строка, преобразованная в число с плавающей точкой
<?php
$s = "5d9";
var_dump(++$s);
var_dump(++$s);
Результат выполнения приведённого примера:
string(3) "5e0" float(6)
Так происходит потому, что значение «5e0»
было интерпретировано
как число с плавающей точкой (float) и приведено к значению 5.0
перед началом увеличения.