В этом модуле мы изучаем nullable типы в PHP функциях. Nullable типы позволяют параметрам и возвращаемым значениям функций быть либо определенного типа, либо null. Это дает большую гибкость при работе с опциональными данными. Вы научитесь правильно объявлять nullable параметры с помощью символа ?, обрабатывать null значения, использовать значения по умолчанию и понимать разницу между nullable и обычными типами. Также рассмотрим особенности работы с nullable типами в PHP 7.1+ и альтернативный синтаксис union типов в PHP 8.0. Задания расположены от базового синтаксиса до продвинутых случаев использования.
- Модуль 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+
Базовый синтаксис nullable типа
Объявите функцию с nullable параметром типа string. Функция должна принимать имя пользователя или null.
<?php
function greetUser(input1S $name) {
if ($name === null) {
return "Hello, Guest!";
}
return "Hello, " . $name . "!";
}
// Использование функции
echo greetUser("Alice"); // Hello, Alice!
echo greetUser(input2S); // Hello, Guest!Исправьте ошибки в nullable объявлениях
В коде есть ошибки в синтаксисе nullable типов. Найдите и исправьте их.
<?phpfunction processData(string? $data): ?array { if ($data === null) { return null; } return explode(',', $data);} function getValue(): int? { return rand(0, 1) ? 42 : null;}Результат функции с nullable параметром
Определите, что выведет данный код с nullable параметрами и значениями по умолчанию.
<?php
function calculatePrice(?float $amount, ?float $tax = 0.1) {
if ($amount === null) {
return "No amount";
}
if ($tax === null) {
return $amount;
}
return $amount + ($amount * $tax);
}
echo calculatePrice(100, 0.2) . PHP_EOL;
echo calculatePrice(100, null) . PHP_EOL;
echo calculatePrice(null, 0.5);Соберите функцию с nullable типами
Соберите функцию findUser, которая ищет пользователя по ID и возвращает массив данных или null.
function findUser(?int $id): ?array { if ($id === null) { return null; } $users = [ 1 => ['name' => 'Alice', 'age' => 25], 2 => ['name' => 'Bob', 'age' => 30] ]; return $users[$id] ?? null;}function findUser($id) { return isset($users[$id]); $users = null;Заполните пропуски nullable типами
Используя элементы из банка, создайте функцию с правильными nullable типами для работы с опциональными данными.
<?php
function createEvent(
string $title,
input1S $description = null,
input2S $date = null
): array {
$event = ['title' => $title];
if ($description !== input3S) {
$event['description'] = $description;
}
if ($date !== null) {
$event['date'] = $date->format('Y-m-d');
}
return $event;
}Каскадные nullable проверки
Проанализируйте код с цепочкой nullable проверок и укажите финальный результат.
<?php
function processOrder(?array $items, ?float $discount = 0.0): ?float {
if ($items === null || empty($items)) {
return null;
}
$total = array_sum($items);
if ($discount === null) {
return $total;
}
return $total - ($total * $discount);
}
$order = [10.5, 20.0, 15.5];
$result = processOrder($order, 0.1);
echo $result;Типы и их nullable версии
Сопоставьте описания с правильными nullable объявлениями типов.
array?intUser?string $text = nullstring|nullПроблемы совместимости типов
В коде есть ошибки несовместимости nullable и строгих типов. Исправьте их для корректной работы.
<?phpdeclare(strict_types=1); function processName(string $name): string { return strtoupper($name);} function handleUser(?string $username) { // Ошибка: передаем nullable в non-nullable $result = processName($username); return $result;} // Вызов с null вызовет ошибкуecho handleUser(null);Nullable в классах и методах
Дополните класс с nullable свойствами и методами для корректной работы с опциональными данными.
<?php
class Product {
private string $name;
private input1S $description;
private ?float $discount;
public function __construct(
string $name,
?string $description = input2S,
?float $discount = null
) {
$this->name = $name;
$this->description = $description;
$this->discount = $discount;
}
public function getDescription(): input3S {
return $this->description;
}
public function hasDiscount(): bool {
return $this->discount !== input4S;
}
}Nullable и тернарный оператор
Определите результат работы кода с nullable типами и тернарными операторами.
<?php
function getValue(?int $input): string {
// ?? проверяет именно на null
$value1 = $input ?? 0;
// ?: проверяет на истинность
$value2 = $input ?: 0;
return "v1=$value1, v2=$value2";
}
echo getValue(5) . PHP_EOL;
echo getValue(0) . PHP_EOL;
echo getValue(null);Nullable с массивами и объектами
Проанализируйте работу функции с nullable массивами и определите финальный вывод.
<?php
function mergeData(?array $primary, ?array $secondary = null): array {
if ($primary === null && $secondary === null) {
return [];
}
if ($primary === null) {
return $secondary;
}
if ($secondary === null) {
return $primary;
}
return array_merge($primary, $secondary);
}
$result = mergeData(['a' => 1], ['b' => 2, 'a' => 3]);
echo json_encode($result);Nullable в интерфейсах и наследовании
Исправьте ошибки совместимости типов при реализации интерфейса с nullable типами.
<?phpinterface DataProcessor { public function process(?string $data): ?array;} class JsonProcessor implements DataProcessor { // Ошибка: несовместимая сигнатура public function process(string $data): array { return json_decode($data, true); }} class XmlProcessor implements DataProcessor { // Ошибка: неправильный возвращаемый тип public function process(?string $data): array { if ($data === null) return []; return ['xml' => $data]; }}Union типы vs Nullable (PHP 8)
Заполните пропуски, используя современный синтаксис union типов PHP 8 как альтернативу nullable типам.
<?php
// PHP 7.1+ nullable синтаксис
function oldWay(?string $value): ?int {
return $value !== null ? strlen($value) : null;
}
// PHP 8.0+ union type синтаксис
function newWay(input1S $value): input2S {
return $value !== null ? strlen($value) : null;
}
// Расширенный union тип
function processValue(input3S $data): string {
if (is_string($data)) {
return $data;
}
if (is_int($data)) {
return (string) $data;
}
return 'null';
}
// Mixed с null (избыточно, так как mixed уже включает null)
function acceptAnything(input4S $anything): void {
var_dump($anything);
}Комплексный пример с nullable
Заполните пропуски в классе сервиса, используя правильные nullable типы из банка для создания гибкой системы конфигурации.
<?php
class ConfigService {
private array $config;
private input1S $cache = null;
public function __construct(array $config, input2S $cacheDriver = null) {
$this->config = $config;
$this->cache = $cacheDriver;
}
public function get(string $key, mixed $default = null): mixed {
// Сначала проверяем кэш
if ($this->cache !== input3S) {
$cached = $this->cache->get($key);
if ($cached !== null) {
return $cached;
}
}
// Затем конфиг
return $this->config[$key] ?? $default;
}
public function getCache(): input4S {
return $this->cache;
}
}
interface CacheDriver {
public function get(string $key): input5S;
public function set(string $key, mixed $value): void;
}