Union types, появившиеся в PHP 8, — это мощный инструмент, который делает код более гибким и одновременно строгим. Раньше, если функция могла принимать, например, число или строку, приходилось либо отказываться от типизации, либо использовать сложные doc-блоки. Теперь можно просто указать `int|string`.
Этот тренажер поможет вам разобраться в синтаксисе и особенностях объединенных типов. Вы начнете с простых объявлений, научитесь исправлять частые ошибки, предсказывать поведение кода при передаче разных типов данных и даже собирать целые функции и классы, используя новые возможности. Задания постепенно усложняются, чтобы вы могли уверенно освоить эту важную фичу PHP 8.
- Модуль 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 types.
- Named arguments.
Объявление свойства с Union Type
В PHP 8 свойства класса могут иметь объединенные типы. Объявите публичное свойство `$id`, которое может быть либо целым числом (`int`), либо строкой (`string`).
class Product
{
public input1S $id;
public function __construct(int|string $id)
{
$this->id = $id;
}
}Исправьте разделитель в Union Type
В коде допущена распространенная ошибка при объявлении объединенного типа для параметра функции. Найдите и исправьте ее, чтобы код стал валидным.
<?phpdeclare(strict_types=1); function process_value(string, int $value){ echo "Processing: " . $value;} process_value("test");Что произойдет при передаче неверного типа?
Проанализируйте код. Функция `set_score` ожидает получить целое число или `null`. Что произойдет, если передать в нее строку? Выберите правильный вариант.
<?php
declare(strict_types=1);
function set_score(int|null $score)
{
if ($score === null) {
echo "Score is not set.";
} else {
echo "Score: " . $score;
}
}
set_score("Not a number");Соберите объявление метода из банка
Перетащите элементы из банка, чтобы завершить объявление метода `setPrice`. Метод должен принимать в качестве аргумента `$newPrice` число с плавающей точкой или целое число. Метод ничего не должен возвращать.
class Product
{
public float|int $price;
public function setPrice(input1S input2S): input3S
{
$this->price = $newPrice;
}
}Соберите функцию, возвращающую Union Type
Соберите из частей функцию `find_config`. Она принимает строковый ключ `$key`. Если значение по ключу равно "port", она должна вернуть число 8080. В противном случае, она должна вернуть `null`. Функция должна корректно объявлять, что может вернуть `int` или `null`.
if ($key === 'port') {}function find_config(string $key): int|null } else {{ return 8080; return null;return 8080; }Какой тип будет у результата?
В PHP типы в Union Type могут взаимодействовать. В данном примере функция принимает `int` или `float` и выполняет сложение. Что выведет `gettype()` для результата вызова этой функции с аргументами `10` (int) и `5.5` (float)? Введите имя типа строчными буквами.
<?php
function add(int|float $a, int|float $b): int|float
{
return $a + $b;
}
$result = add(10, 5.5);
echo gettype($result);Сопоставьте Union Type и его назначение
Сопоставьте каждое объявление объединенного типа в левой колонке с правильным описанием его назначения в правой колонке.
array|Traversableresource|falsestring|nullint|floatРаспределите типы: валидные и невалидные
Ниже приведен список различных объявлений типов. Некоторые из них являются валидными Union Types в PHP 8+, а другие содержат синтаксические ошибки или являются недопустимыми конструкциями. Распределите их по двум категориям.
int|stringstring|nullarray|Countablevoid|intint, string?(string|null)never|stringbool|false