Зарегистрируйтесь, чтобы продолжить обучение

Цикл for Основы PHP

Цикл while идеален для ситуаций, когда количество итераций неизвестно заранее — например, при поиске простого числа. Когда количество итераций известно, предпочтительнее использовать цикл for. Именно его мы изучим в этом уроке.

Посмотрим реализацию переворота строки через цикл for:

<?php

function reverseString($str)
{
    $result = '';

    for ($i = 0; $i < strlen($str); $i += 1) {
        $currentChar = $str[$i];
        $result = "{$currentChar}{$result}";
    }

    return $result;
}

https://replit.com/@hexlet/php-basics-for-reversestring

Этот код можно прочитать так:

Цикл с индексом $i повторяется, пока соблюдается условие $i < strlen($str), и после каждого шага $i увеличивается на 1

Посмотрим, что находится в круглых скобках:

  1. Начальное значение счетчика — этот код выполняется ровно один раз перед первой итерацией
  2. Предикат (условие повторения циклов) — выполняется на каждой итерации, как и в while
  3. Описание изменения счетчика — этот код выполняется в конце каждой итерации

В остальном принцип работы точно такой же, как у цикла while.

Синтаксический сахар

В функции выше мы использовали новую синтаксическую конструкцию $i += 1. Подобные конструкции в PHP используются довольно часто. Это сокращенный вариант записи: $i = $i + 1.

Такие сокращения называют синтаксическим сахаром, потому что они делают процесс написания кода немного проще и приятнее — «подслащивают» его.

Важно понимать, что отличия исключительно в способе записи. Интерпретатор превращает сокращенную конструкцию в развернутую.

Существуют сокращенные формы для всех арифметических операций и для конкатенации строк:

  • $a = $a + 1 то же самое, что и $a += 1
  • $a = $a - 1 то же самое, что и $a -= 1
  • $a = $a * 2 то же самое, что и $a *= 2
  • $a = $a / 1 то же самое, что и $a /= 1
  • $a = $a . 'bla' то же самое, что и $a .= 'bla'

Инкремент и декремент

Из языка Си в PHP перекочевали две операции:

  • Инкремент ++
  • Декремент --

Они очень часто встречаются вместе с циклами. Эти унарные операции увеличивают и уменьшают на единицу число, записанное в переменную:

<?php

$i = 0;
$i++; // 0
$i++; // 1

$i--; // 2
$i--; // 1

При использовании префиксной формы все происходит наоборот. Сначала идет изменение переменной, а затем — возврат нового значения:

<?php

$i = 0;
++$i; // 1
++$i; // 2

--$i; // 1
--$i; // 0

Кажется, что нет никакой разницы между постфиксной и префиксной формами. Но тут начинаются сложности. Все остальные операции не имеют побочных эффектов и просто возвращают новое значение. В отличие от них, инкремент и декремент не только возвращают значение, но и изменяют значение переменной.

При использовании префиксной нотации сначала происходит изменение переменной, а потом — возврат. При использовании постфиксной нотации — наоборот: сначала возврат, а потом изменение переменной.

Правило работает одинаково для инкремента и декремента. Для простоты рассмотрим только инкремент:

<?php

$x = 5;

echo ++$x; // => 6
echo $x;   // => 6

echo $x++; // => 6
echo $x;   // => 7

Обсудим, что пошагово происходит в коде:

  1. Вывели на экран ++$x — это префиксный инкремент, поэтому сначала значение переменной увеличилось на 1, потом результат вернулся и вывелся на экран
  2. Значение изменилось, поэтому echo $x вывел 6
  3. Теперь выводим на экран $x++ — это постфиксный инкремент, поэтому сначала значение вернулось и вывелось на экран, а потом переменная увеличилась на 1
  4. Значение изменилось, поэтому echo $x вывел 7

Инкремент и декремент могут заметно усложнить код. Особенно сложно все становится, когда мы вставляем инкремент внутрь других операций: $x = $i++ - 7 + --$h.

Понять такой код невозможно, поэтому лучше не использовать такие конструкции. Например, в языке JavaScript при проверке кода линтер сразу начинает ругаться, когда видит использование инкремента и декремента.

Мы советуем пользоваться этими конструкциями так:

  • В рамках одного выражения никогда не смешивайте функции без побочных эффектов с функциями с побочными эффектами (то же самое касается операций)
  • Используйте инкремент и декремент только там, где нет разницы между префиксным и постфиксным вариантом: отдельно от всего, на своей собственной строчке кода

Дополнительные материалы

  1. Цикл for

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов
Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff
Рекомендуемые программы
профессия
от 25 000 ₸ в месяц
Разработка веб-приложений на Laravel
10 месяцев
с нуля
Старт 26 декабря

Используйте Хекслет по-максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»