Union types

Тренажер по PHP для пользователей с начальным уровнем подготовки.

Тренажер PHP

Union types, появившиеся в PHP 8, — это мощный инструмент, который делает код более гибким и одновременно строгим. Раньше, если функция могла принимать, например, число или строку, приходилось либо отказываться от типизации, либо использовать сложные doc-блоки. Теперь можно просто указать `int|string`.

Этот тренажер поможет вам разобраться в синтаксисе и особенностях объединенных типов. Вы начнете с простых объявлений, научитесь исправлять частые ошибки, предсказывать поведение кода при передаче разных типов данных и даже собирать целые функции и классы, используя новые возможности. Задания постепенно усложняются, чтобы вы могли уверенно освоить эту важную фичу PHP 8.

Список тем

Объявление свойства с Union Type

id: 39386_task_union_1

В PHP 8 свойства класса могут иметь объединенные типы. Объявите публичное свойство `$id`, которое может быть либо целым числом (`int`), либо строкой (`string`).

Заполните пропуски
class Product
{
    public input1S $id;

    public function __construct(int|string $id)
    {
        $this->id = $id;
    }
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Исправьте разделитель в Union Type

id: 39386_task_union_2

В коде допущена распространенная ошибка при объявлении объединенного типа для параметра функции. Найдите и исправьте ее, чтобы код стал валидным.

Найдите ошибку и исправьте
<?php
declare(strict_types=1);
 
function process_value(string, int $value)
{
    echo "Processing: " . $value;
}
 
process_value("test");
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Что произойдет при передаче неверного типа?

id: 39386_task_union_3

Проанализируйте код. Функция `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");
Сообщения
Проверить
Показать подсказку

Соберите объявление метода из банка

id: 39386_task_union_4

Перетащите элементы из банка, чтобы завершить объявление метода `setPrice`. Метод должен принимать в качестве аргумента `$newPrice` число с плавающей точкой или целое число. Метод ничего не должен возвращать.

Нужно правильно расставить в пропуски предложенные варианты
class Product
{
    public float|int $price;

    public function setPrice(input1S input2S): input3S
    {
        $this->price = $newPrice;
    }
}
float|int
$newPrice
void
string
$price
int|string
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите функцию, возвращающую Union Type

id: 39386_task_union_6

Соберите из частей функцию `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;
    }
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Какой тип будет у результата?

id: 39386_task_union_7

В 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 и его назначение

id: 39386_task_union_8

Сопоставьте каждое объявление объединенного типа в левой колонке с правильным описанием его назначения в правой колонке.

Сопоставьте строки в правой части с соответствующими строками в левой по порядковому номеру
Принимает число (целое или с плавающей точкой)
Принимает массив или любой итерируемый объект
Принимает ресурс (например, файл) или false в случае ошибки
Принимает строку или `null`, если значение отсутствует
array|Traversable
resource|false
string|null
int|float
Сообщения
Проверить
Показать подсказку

Распределите типы: валидные и невалидные

id: 39386_task_union_9

Ниже приведен список различных объявлений типов. Некоторые из них являются валидными Union Types в PHP 8+, а другие содержат синтаксические ошибки или являются недопустимыми конструкциями. Распределите их по двум категориям.

Перетяните элементы в соответствующие блоки
Валидные Union Types
Невалидные или избыточные
int|string
string|null
array|Countable
void|int
int, string
?(string|null)
never|string
bool|false
Сообщения
Проверить
Показать подсказку
НайтиКурс.Ру