🐘 PHP

PHP 8.2 में फ़ंक्शन और पुनरावृत्ति: विस्तृत मार्गदर्शिका

Функции и рекурсия в PHP

Что такое функция и зачем она нужна?

Представь, что ты пишешь программу для управления семейным бюджетом. Тебе нужно складывать доходы каждый день. Вместо того чтобы писать код сложения заново 30 раз, ты можешь создать функцию — маленькую программу внутри большой программы. Функция — это именованный блок кода, который выполняет одну задачу и может быть вызван сколько угодно раз.

Функции помогают:

  • Не повторять один и тот же код
  • Разбить сложную задачу на простые части
  • Легко находить и исправлять ошибки

Основной синтаксис функции в PHP 8.2

Чтобы создать функцию, используй ключевое слово function, дай ей имя и укажи в скобках параметры (входные данные). Функция может возвращать результат с помощью return.

<?php
// Создаем функцию, которая складывает два числа
function summa(int $a, int $b): int {
    return $a + $b;
}

// Вызываем функцию и выводим результат
echo summa(5, 3); // Выведет: 8
?>

Разберем по частям:

  • function summa — объявление функции с именем summa
  • (int $a, int $b) — параметры: числа, которые мы передаем в функцию
  • : int — говорим, что функция вернет целое число
  • return $a + $b; — вычисляем сумму и возвращаем её

Пример 1: Сравнение температур (функция с условием)

<?php
function maxTemperature(float $t1, float $t2): float {
    if ($t1 > $t2) {
        return $t1;
    } else {
        return $t2;
    }
}

// Ввод данных с клавиатуры
echo "Введите первую температуру: ";
$temp1 = (float)trim(fgets(STDIN));
echo "Введите вторую температуру: ";
$temp2 = (float)trim(fgets(STDIN));

$result = maxTemperature($temp1, $temp2);
echo "Максимальная температура: " . $result . "\n";
?>

Пример 2: Проверка четности числа

<?php
function isEven(int $number): bool {
    // Если остаток от деления на 2 равен 0 — число четное
    return $number % 2 == 0;
}

echo "Введите количество коробок: ";
$boxes = (int)trim(fgets(STDIN));

if (isEven($boxes)) {
    echo "Число коробок четное, можно упаковывать в пары.\n";
} else {
    echo "Число коробок нечетное, добавьте одну коробку.\n";
}
?>

Пример 3: Реверс строки (функция со строкой)

<?php
function reverseString(string $text): string {
    // strrev — встроенная функция PHP для переворота строки
    return strrev($text);
}

echo "Введите сообщение: ";
$input = trim(fgets(STDIN));
echo "Перевернутое сообщение: " . reverseString($input) . "\n";
?>

Что такое рекурсия?

Рекурсия — это когда функция вызывает саму себя. Это как матрешка: большая матрешка открывается, внутри — такая же, но меньше, и так до самой маленькой. Рекурсия удобна для задач, которые можно разбить на одинаковые подзадачи.

У рекурсии обязательно должно быть условие остановки (базовый случай), чтобы функция не вызывала себя бесконечно.

Пример 4: Поиск минимального элемента списка (рекурсия)

<?php
function findMin(array $list, int $index = 0, float $currentMin = null): float {
    // Базовый случай: дошли до конца списка
    if ($index == count($list)) {
        return $currentMin;
    }
    
    // Если это первый элемент — он и есть минимальный
    if ($currentMin === null) {
        $currentMin = $list[$index];
    } else {
        // Сравниваем и обновляем минимум
        if ($list[$index] < $currentMin) {
            $currentMin = $list[$index];
        }
    }
    
    // Рекурсивный вызов: переходим к следующему элементу
    return findMin($list, $index + 1, $currentMin);
}

// Пример: температуры за день
$temperatures = [15.5, 12.3, 18.1, 10.0, 14.7, 9.8, 16.2];
echo "Самая низкая температура за день: " . findMin($temperatures) . "°C\n";
?>

Пример 5: Семейный бюджет (сумма доходов)

<?php
function calculateIncome(float $salary, float $freelance): float {
    return $salary + $freelance;
}

echo "Введите зарплату: ";
$salary = (float)trim(fgets(STDIN));
echo "Введите доход от фриланса: ";
$freelance = (float)trim(fgets(STDIN));

$total = calculateIncome($salary, $freelance);
echo "Общий доход семьи: " . number_format($total, 2) . " руб.\n";
?>

Частые ошибки новичков

  • Забыть return: Функция без return возвращает null. Всегда проверяй, что функция возвращает то, что нужно.
  • Бесконечная рекурсия: Если забыть условие остановки, программа зависнет. Всегда проверяй, что рекурсия когда-нибудь закончится.
  • Неправильные типы данных: Если функция ожидает int, а ты передаешь строку "abc", PHP может выдать ошибку. Используй строгую типизацию.
  • Глобальные переменные: Старайся не использовать переменные извне внутри функции — передавай их как параметры.

Итоговый пример: Поиск самого длинного слова

Давай решим задачу: найти самое длинное слово в предложении. Мы используем функции и рекурсию для обхода слов.

<?php
// Функция для поиска самого длинного слова (рекурсивная версия)
function findLongestWord(array $words, int $index = 0, string $longest = ""): string {
    // Базовый случай: все слова проверены
    if ($index == count($words)) {
        return $longest;
    }
    
    // Если текущее слово длиннее — запоминаем его
    if (strlen($words[$index]) > strlen($longest)) {
        $longest = $words[$index];
    }
    
    // Рекурсивно проверяем следующее слово
    return findLongestWord($words, $index + 1, $longest);
}

echo "Введите предложение: ";
$input = trim(fgets(STDIN));

// Разбиваем строку на слова (разделитель — пробел)
$wordList = explode(" ", $input);

$result = findLongestWord($wordList);
echo "Самое длинное слово: " . $result . "\n";
echo "Его длина: " . strlen($result) . " символов\n";
?>

Как это работает:

  1. Функция findLongestWord принимает массив слов
  2. Начинает с первого слова (индекс 0)
  3. Сравнивает длину текущего слова с самым длинным на данный момент
  4. Вызывает саму себя для следующего слова
  5. Когда доходит до конца списка — возвращает самое длинное слово

Теперь ты знаешь, как использовать функции и рекурсию в PHP! Практикуйся на задачах из раздела, и скоро ты сможешь писать сложные программы, разбивая их на простые функции.