Union типы (PHP 8)

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

Тренажер PHP

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

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

Список тем

Объявление Union типа для параметра

id: 38995_task_union_1

Дополните объявление типа для параметра функции. Функция `printId` должна принимать в качестве идентификатора как целое число (`int`), так и строку (`string`). Впишите недостающий тип в объявление параметра `$id`.

Заполните пропуски
<?php
function printId(int|input1S $id)
{
    echo "ID пользователя: " . $id;
}

printId(123);
echo "\n";
printId("user-456");
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Union тип для возвращаемого значения

id: 38995_task_union_2

Укажите, что функция может возвращать два типа данных. В зависимости от наличия пользователя в базе данных, функция `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));
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 38995_task_union_3

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

Найдите ошибку и исправьте
<?php
function processValue(int & string $value): void
{
    echo "Тип данных: " . gettype($value);
}
 
processValue("test");
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите объявление функции из банка

id: 38995_task_union_4

Перетащите элементы из банка, чтобы составить правильное объявление функции `processData`. Эта функция должна принимать параметр `$data`, который может быть либо массивом (`array`), либо `null`.

Нужно правильно расставить в пропуски предложенные варианты
<?php
input1S input2S(input3S|input4S $data): void
{
    if (is_array($data)) {
        echo "Получен массив с " . count($data) . " элементами.";
    } else {
        echo "Данные не предоставлены.";
    }
}
function
processData
array
null
string
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

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

id: 38995_task_union_5

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

Что выведет код?

id: 38995_task_union_6

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

Устраните избыточность в объявлении типа

id: 38995_task_union_7

В PHP вопросительный знак перед типом (`?TypeName`) является краткой записью для `TypeName|null`. В коде используется и то, и другое, что является избыточным и вызовет фатальную ошибку. Исправьте объявление возвращаемого типа, оставив только один канонический вариант.

Найдите ошибку и исправьте
<?php
class Config {}
 
function getConfig(): ?Config|null
{
    // some logic to find config
    return null;
}
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку

Соберите рабочую функцию с вызовом

id: 38995_task_union_8

Из перемешанных строк кода соберите полную программу. Она должна содержать функцию `calculate_price`, которая принимает цену в виде `int` или `float` и возвращает итоговую стоимость в виде строки с указанием валюты. Затем эта функция должна быть вызвана, а ее результат — выведен на экран.

Перетяните в правильном порядке строки из одного блока в другой
<?php
echo calculate_price(19.99);
}
return "Цена: " . $price . " USD";
function calculate_price(int|float $price): string {
return $price;
function calculate_price(int $price) {
?>
Сообщения
Проверить
Показать решение на 3 сек.
Показать подсказку
НайтиКурс.Ру