Union типы (объединенные типы), появившиеся в PHP 8, — это мощный инструмент, который делает код одновременно более гибким и строгим. Вместо того чтобы разрешать параметру функции или ее возвращаемому значению быть чем угодно, вы можете указать точный набор допустимых типов. Например, функция может принимать идентификатор, который является либо числом (int), либо строкой (string). Это помогает избежать ошибок и делает намерения программиста понятнее.
В этом наборе заданий мы начнем с основ: научимся правильно объявлять union-типы для аргументов и возвращаемых значений. Затем мы попрактикуемся в поиске и исправлении типичных ошибок в синтаксисе. Наконец, вам предстоит предсказать результат выполнения кода, использующего union-типы, и собрать целые функции из разрозненных частей. Это поможет вам не только запомнить синтаксис, но и понять логику их работы.
- Модуль 1: Основы синтаксиса PHP
- Модуль 2: Переменные и типы данных
- Модуль 3: Операторы
- Модуль 4: Условные конструкции
- Модуль 5: Циклы
- Модуль 6: Массивы
- Индексированные массивы.
- Ассоциативные массивы.
- Многомерные массивы.
- Добавление элементов в массив.
- Удаление элементов из массива.
- Функция count().
- Функция array_push() и array_pop().
- Функция array_shift() и array_unshift().
- Функция array_merge().
- Функция array_slice().
- Функция array_splice().
- Функция in_array().
- Функция array_search().
- Функция array_keys() и array_values().
- Функция array_unique().
- Функция array_reverse().
- Сортировка: sort(), rsort().
- Сортировка: asort(), arsort().
- Сортировка: ksort(), krsort().
- Функция array_map().
- Функция array_filter().
- Функция array_reduce().
- Функция array_walk().
- Функция array_column().
- Деструктуризация массивов.
- Модуль 7: Функции
- Объявление функций.
- Вызов функций.
- Параметры функций.
- Возврат значений return.
- Значения параметров по умолчанию.
- Передача по значению.
- Передача по ссылке.
- Переменное количество аргументов.
- Оператор распаковки ....
- Типизация параметров.
- Типизация возвращаемых значений.
- Nullable типы.
- Union типы (PHP 8).
- Именованные аргументы (PHP 8).
- Анонимные функции.
- Стрелочные функции.
- Замыкания и use.
- Рекурсивные функции.
- Глобальные переменные в функциях.
- Статические переменные в функциях.
- Модуль 8: Работа со строками
- Одинарные и двойные кавычки.
- Экранирование символов.
- Heredoc и Nowdoc синтаксис.
- Функция strlen().
- Функция substr().
- Функция str_replace().
- Функция strpos() и strrpos().
- Функция explode() и implode().
- Функция trim(), ltrim(), rtrim().
- Функция strtolower() и strtoupper().
- Функция ucfirst() и ucwords().
- Функция str_repeat().
- Модуль 9: Суперглобальные переменные
- Модуль 10: Работа с формами
- Модуль 11: Работа с файлами
- Модуль 12: Дата и время
- Модуль 13: Регулярные выражения
- Модуль 14: Сессии и Cookie
- Модуль 15: Include и Require
- Модуль 16: Объектно-ориентированное программирование
- Модуль 17: Пространства имен
- Модуль 18: Обработка ошибок и исключений
- Модуль 19: Работа с JSON и XML
- Модуль 20: Работа с базами данных MySQLi
- Модуль 21: PDO - PHP Data Objects
- Модуль 22: Composer и зависимости
- Модуль 23: cURL и HTTP запросы
- Модуль 24: REST API
- Модуль 25: Безопасность
- Модуль 26: Генераторы и итераторы
- Модуль 27: Reflection API
- Модуль 28: Работа с изображениями
- Модуль 29: Отправка email
- Модуль 30: Паттерны проектирования
- Модуль 31: Тестирование
- Модуль 32: Продвинутые возможности PHP 8+
Объявление Union типа для параметра
Дополните объявление типа для параметра функции. Функция `printId` должна принимать в качестве идентификатора как целое число (`int`), так и строку (`string`). Впишите недостающий тип в объявление параметра `$id`.
<?php
function printId(int|input1S $id)
{
echo "ID пользователя: " . $id;
}
printId(123);
echo "\n";
printId("user-456");Union тип для возвращаемого значения
Укажите, что функция может возвращать два типа данных. В зависимости от наличия пользователя в базе данных, функция `findUser` должна возвращать либо объект класса `User`, либо `null`. Дополните объявление возвращаемого типа.
<?php
class User
{
public function __construct(public string $name) {}
}
function findUser(int $id): User|input1S
{
if ($id > 0) {
return new User("Alex");
}
return null;
}
var_dump(findUser(1));
var_dump(findUser(0));Исправьте разделитель типов
В коде допущена синтаксическая ошибка при объявлении union-типа. Найдите и исправьте неверный символ, который используется для разделения типов в параметре функции `processValue`.
<?phpfunction processValue(int & string $value): void{ echo "Тип данных: " . gettype($value);} processValue("test");Соберите объявление функции из банка
Перетащите элементы из банка, чтобы составить правильное объявление функции `processData`. Эта функция должна принимать параметр `$data`, который может быть либо массивом (`array`), либо `null`.
<?php
input1S input2S(input3S|input4S $data): void
{
if (is_array($data)) {
echo "Получен массив с " . count($data) . " элементами.";
} else {
echo "Данные не предоставлены.";
}
}Какой тип данных будет у результата?
Проанализируйте функцию `normalize_id` и её вызов. Определите, какой тип данных будет возвращен и выведен на экран с помощью `gettype()`, если на вход подать целое число.
<?php
function normalize_id(int|string $id): string
{
if (is_int($id)) {
return 'id-' . $id;
}
return $id;
}
$result = normalize_id(404);
echo gettype($result);Что выведет код?
Внимательно изучите код. Функция `format_data` обрабатывает входные данные по-разному в зависимости от их типа. Определите, какой именно текст будет выведен на экран в результате вызова этой функции со значением `false`.
<?php
function format_data(string|bool|null $data): string
{
if (is_null($data)) {
return 'empty';
}
if (is_bool($data)) {
return $data ? 'true' : 'false';
}
return $data;
}
$data = false;
echo format_data($data);Устраните избыточность в объявлении типа
В PHP вопросительный знак перед типом (`?TypeName`) является краткой записью для `TypeName|null`. В коде используется и то, и другое, что является избыточным и вызовет фатальную ошибку. Исправьте объявление возвращаемого типа, оставив только один канонический вариант.
<?phpclass Config {} function getConfig(): ?Config|null{ // some logic to find config return null;}Соберите рабочую функцию с вызовом
Из перемешанных строк кода соберите полную программу. Она должна содержать функцию `calculate_price`, которая принимает цену в виде `int` или `float` и возвращает итоговую стоимость в виде строки с указанием валюты. Затем эта функция должна быть вызвана, а ее результат — выведен на экран.
<?phpecho calculate_price(19.99);}return "Цена: " . $price . " USD";function calculate_price(int|float $price): string {return $price;function calculate_price(int $price) {?>