Инкремент и составное присваивание
В прошлом уроке операторы считали новое значение, а переменные оставались прежними. Часто нужно другое: изменить саму переменную — прибавить к счёту, дописать к строке.
У многих калькуляторов есть память и кнопка M+. Она прибавляет число с экрана к тому, что уже лежит в памяти, и старое значение не нужно набирать заново. В PHP эту работу делают операторы, которые меняют переменную на месте.
Без них имя переменной приходится писать дважды:
<?php
$total = 10;
$total = $total + 5;
$total += 5;
$total *= 2;
echo $total, "\n"; // 40Разберём по строкам:
$total = 10кладёт в$totalчисло10.$total = $total + 5читает старое значение, прибавляет5и записывает15обратно.$total += 5делает то же самое короче: теперь в$totalлежит20.$total *= 2умножает на два, и программа печатает40.
Составное присваивание
Запись $total += 5 называют составным присваиванием: оператор и знак = слиты в один. Такая запись есть у каждого арифметического оператора:
+=прибавляет:$n += 2— это$n = $n + 2;-=вычитает;*=умножает;/=делит;%=оставляет остаток;**=возводит в степень: после$c = 3; $c **= 2;в$cлежит9.
Тип результата подчиняется тем же правилам, что и у обычной арифметики. После $n = 10; $n /= 4; в $n лежит float(2.5), потому что 10 на 4 нацело не делится.
Оператор .= для строк
Оператор .= приклеивает строку справа к той, что уже лежит в переменной. Так строку собирают по кусочкам:
$line = 'PHP';
$line .= ' ';
$line .= 8;
echo $line, "\n"; // PHP 8Перед склейкой число 8 превращается в строку '8', поэтому в $line получается PHP 8. Здесь кнопка M+ перестаёт быть точной картинкой: калькулятор умеет только прибавлять числа, а .= дописывает текст.
Инкремент и декремент
Прибавлять единицу приходится так часто, что для этого есть отдельный оператор. $i++ увеличивает $i на один — это инкремент. $i-- уменьшает на один — это декремент.
У каждого из них две формы. Разница видна, когда результат сразу записывают в другую переменную или печатают.
$i++: сначала старое значение
Представьте автомат с талонами в очереди. Он выдаёт вам номер, который горит на табло, и сразу переключает табло на следующий. У вас в руке старый номер, а на табло уже новый.
Так работает $a = $i++: в $a попадает старое значение $i, а сама $i после строки уже на единицу больше.
++$i: сначала прибавить
Форма ++$i делает наоборот: сначала переключает табло, а потом выдаёт номер с него. В $b = ++$i переменная $i сначала увеличивается, и в $b попадает уже новое значение.
Нажимайте «Следующий шаг» и на каждом шаге сравнивайте два числа: что получила $a или $b и что лежит в $i после строки.
1<?php2 3$i = 1;4$a = $i++;5$b = ++$i;6$s = 'x';7$s .= $i;8echo $a, ' ', $b, ' ', $i, "\n";9echo $s, "\n";
Переменная $i получает значение 1.
Обе формы меняют переменную одинаково: после $i++ и после ++$i в $i на единицу больше. Различается только значение, которое отдаёт само выражение: у $i++ старое, у ++$i новое.
Здесь автомат с талонами — неточная картинка: его табло только растёт, а $i-- и --$i уменьшают переменную по тем же правилам.
Чем $i++ отличается от ++$i, часто спрашивают на собеседовании. Ответ складывается из трёх фактов этого урока:
- оба оператора увеличивают
$iна единицу; $i++возвращает значение до увеличения;++$iвозвращает значение после увеличения.
Частая ошибка
Счётчик увеличивают и тут же записывают результат обратно:
$count = 5;
$count = $count++; // ✗
echo $count, "\n"; // 5Вы ждали 6, а PHP печатает 5. $count++ отдаёт старое значение 5 и увеличивает $count до 6, но затем = записывает в $count отданную пятёрку. Сообщения об ошибке нет. Чтобы увеличить переменную, хватит одной строки $count++; без присваивания.
Главное
$total += 5— короткая запись$total = $total + 5; так же работают-=,*=,/=,%=и**=..=приклеивает строку справа к значению переменной.$i++отдаёт старое значение, а++$i— новое; переменная увеличивается в обоих случаях.$i = $i++оставляет$iпрежней: присваивание записывает старое значение.