Функции и массивы в PHP 8
Студент научится создавать функции со строгой типизацией, работать с массивами и применять встроенные возможности PHP для обработки данных.
Пользовательские функции и строгая типизация аргументов
Функции — это основа переиспользуемого кода. В контексте интернет-магазина у нас будут десятки функций: для расчета налогов, валидации email, форматирования цен. Метод Mastery Learning требует, чтобы мы не двигались дальше, пока не научимся правильно объявлять функции. В PHP 8 хорошим тоном является указание типов как для принимаемых аргументов (type hinting), так и для возвращаемого значения (return type). Это служит отличной документацией к коду и защищает от логических ошибок. Если функция должна возвращать цену со знаком доллара, её тип возвращаемого значения должен быть string. Если функция может ничего не возвращать, используется тип void. А если функция может вернуть строку ИЛИ null, используется синтаксис ?string (nullable тип).
Рассмотрим пример расчета итоговой стоимости корзины. Мы передаем в функцию массив товаров. Типизация массива в PHP ограничивается словом array (в отличие от строго типизированных языков, где можно указать массив конкретных объектов, хотя это решается через PHPDoc). В теле функции мы применяем бизнес-логику и обязательно возвращаем значение ожидаемого типа.
<?php
declare(strict_types=1);
// Функция с типизацией аргументов и возвращаемого значения
function calculateTotal(float $price, int $quantity, float $discount = 0.0): float {
$total = ($price * $quantity) - $discount;
return $total > 0 ? $total : 0.0;
}
$finalPrice = calculateTotal(150.50, 2, 20.0);
echo "Итого к оплате: $" . number_format($finalPrice, 2);
Массивы: Индексные и Ассоциативные
Массивы в PHP — это невероятно гибкая структура данных, представляющая собой упорядоченные карты (ordered maps). В проекте интернет-магазина массивы используются повсеместно: от хранения списка ID товаров в сессии пользователя (корзина) до получения результатов запросов из базы данных. Индексные массивы используют числовые ключи (по умолчанию начиная с 0). Ассоциативные массивы используют строковые ключи, что делает их похожими на словари или JSON-объекты. В архивных материалах мы видим использование сессионной корзины: $cart = session()->get('cart', []);, где корзина — это ассоциативный массив, где ключом является ID товара, а значением — другой массив с данными товара (имя, цена, количество). Это называется многомерным массивом.
Для работы с массивами PHP предлагает огромную библиотеку встроенных функций. Ключевые функции, которые нам понадобятся: array_map() (применяет функцию ко всем элементам), array_filter() (фильтрует элементы), array_sum() (вычисляет сумму значений). В упражнении 1.1 (сохранение заказа) используется комбинация этих функций: array_sum(array_map(fn($item) => $item['price'] * $item['quantity'], $cart)). Здесь также применяется стрелочная функция (arrow function fn() =>), появившаяся в PHP 7.4, которая лаконично описывает логику без необходимости использовать ключевые слова function и return.
<?php
// Структура корзины (ассоциативный многомерный массив)
$cart = [
101 => ['name' => 'Мышь', 'price' => 25.0, 'quantity' => 2],
105 => ['name' => 'Клавиатура', 'price' => 70.0, 'quantity' => 1]
];
// Расчет общей суммы с использованием array_reduce или array_map+array_sum
// Используем стрелочную функцию (arrow function)
$total = array_sum(array_map(fn($item) => $item['price'] * $item['quantity'], $cart));
echo "Сумма корзины: $total";
Флеш-карточки
Что делает функция array_map()?
Нажмите, чтобы увидеть ответ
Применяет callback-функцию ко всем элементам указанного массива и возвращает новый массив.
Нажмите, чтобы вернуться
Что такое ассоциативный массив в PHP?
Нажмите, чтобы увидеть ответ
Массив, в котором в качестве ключей (индексов) используются строки, а не числа.
Нажмите, чтобы вернуться
Как в PHP объявить функцию, которая не должна ничего возвращать?
Напишите ключевое слово, которое используется в PHP 8 для объявления стрелочной (короткой) функции.
| Функция PHP | Описание | Пример в E-commerce |
|---|---|---|
| array_key_exists | Проверяет наличие ключа в массиве | Проверка, есть ли product_id в корзине |
| array_sum | Считает сумму элементов | Подсчет итоговой стоимости |
| unset | Удаляет переменную или элемент массива | Удаление товара из корзины |