Функции PHP 8: обновления и примеры использования
Основные нововведения в функциях PHP 8
Как вызывать функции с передачей аргументов по имени?
Именованные аргументы (Named Arguments)
В PHP 8 появилась возможность передавать аргументы по имени, а не только по позиции. Это позволяет пропускать необязательные параметры, менять порядок аргументов и делает код самодокументируемым.
function createUser(string $name, int $age = 18, string $city = 'Unknown', bool $active = true): void {
echo "Name: $name, Age: $age, City: $city, Active: " . ($active ? 'Yes' : 'No') . "\n";
}
// Вызов с именованными аргументами
createUser(name: 'Alice', city: 'Moscow', age: 25);
Php 8 request (особенности обработки запросов в php 8)
В примере параметр $active не передан, поэтому используется значение по умолчанию true. Аргументы указаны в произвольном порядке.
Возможные проблемы:
- Нельзя использовать именованный аргумент после позиционного. Следующий код вызовет ошибку:
createUser('Bob', city: 'London'); - Именованные аргументы не работают с функциями, которые используют
func_get_args()или...$args(вариативные параметры), если в вызове есть смешивание. - Совместимость: код на PHP 7 не выполнится.
Решение: в новых проектах использовать именованные аргументы для улучшения читаемости, особенно в функциях с большим количеством необязательных параметров. При рефакторинге стоит проверять версию PHP и наличие вариативных параметров.
Как указать, что параметр может принимать несколько типов?
Union Types
Объединённые типы позволяют объявить параметр, возвращаемое значение или свойство как один из нескольких типов.
function formatPrice(int|float $price): string {
return number_format($price, 2) . ' руб.';
}
echo formatPrice(1000); // int
echo formatPrice(99.99); // float
echo formatPrice('100'); // Ошибка типа
Php 8.4 windows (php 8.4 на windows)
Типы перечисляются через вертикальную черту. Можно комбинировать с nullable (?int|float или int|float|null).
Типичные ошибки:
- Попытка передать значение неподходящего типа (например, строку, если она не объявлена) приведёт к
TypeError. - В старых версиях PHP код не будет работать.
Как заменить громоздкий switch более лаконичным выражением?
Match Expression
Конструкция match - это улучшенная альтернатива switch, которая возвращает значение, поддерживает строгое сравнение и множественные условия.
$status = 200;
$message = match ($status) {
200, 204 => 'Success',
301, 302 => 'Redirect',
400, 404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown'
};
echo $message; // Success
Php 7 функции (новые функции php 7)
match не требует break и выполняет только первую подходящую ветку. Используется строгое сравнение (===).
Проблемы:
- Если ни одна ветка не совпала и нет
default, выбрасываетсяUnhandledMatchError. - В отличие от
switch, не поддерживает блоки кода без возврата (можно, но не рекомендуется).
Как безопасно обращаться к свойствам или методам потенциально null-объектов?
Nullsafe Operator
Оператор ?-> позволяет вызывать методы или получать свойства, не проверяя каждый раз на null. Если значение null, цепочка обрывается и возвращается null.
class Address {
public function getCity(): ?string { return 'Moscow'; }
}
class User {
public ?Address $address = null;
}
$user = new User();
// Раньше требовалась проверка:
$city = $user->address !== null ? $user->address->getCity() : null;
// Теперь:
$city = $user?->address?->getCity();
echo $city ?? 'Город не указан';
обновление php wordpress (обновление версии php для wordpress)
Оператор работает только с методами и свойствами, не с массивами.
Ошибки:
- Использование
?->в цепочке с обычным->может привести к ошибке, если промежуточное значение null, а следующий вызов обычный. - Не подходит для вызова функций или конструкций, отличных от доступа к объекту.
Как проверить наличие подстроки без использования strpos?
Новые строковые функции: str_contains, str_starts_with, str_ends_with
В PHP 8 добавлены удобные функции для работы со строками, возвращающие boolean.
$email = 'user@example.com';
if (str_contains($email, '@')) {
echo 'Email содержит @';
}
if (str_starts_with($email, 'user')) {
echo 'Начинается с user';
}
if (str_ends_with($email, '.com')) {
echo 'Заканчивается на .com';
}
Эти функции учитывают регистр (чувствительны). Для регистронезависимой проверки используйте str_contains(strtolower($str), ...) или mb_ аналоги.
Проблемы:
- В старых версиях PHP эти функции не определены. Необходимо обновление или полифилл.
- Не поддерживают многобайтовые символы (кириллица) без
mb_версий, которых пока нет. Для юникода используйтеmb_strposс проверкой.
Расширенные примеры использования функций PHP 8
Дополнительные примеры с пояснениями и результатами выполнения.
Именованные аргументы с классами
class Product {
public function __construct(
public string $name,
public float $price = 0.0,
public int $quantity = 1,
public ?string $description = null
) {}
}
$product = new Product(
name: 'Ноутбук',
quantity: 5,
description: 'Игровой ноутбук'
);
var_dump($product);
object(Product)#1 (4) {
["name"] => string(14) "Ноутбук"
["price"] => float(0)
["quantity"] => int(5)
["description"] => string(26) "Игровой ноутбук"
}
Параметр $price не передан, используется значение по умолчанию 0. Имена аргументов совпадают с именами свойств в конструкторе благодаря Constructor Property Promotion.
Union Types с nullable и void
function findUser(int $id): User|false|null {
// Логика поиска
if ($id === 1) {
return new User('Alice');
}
if ($id === 0) {
return null; // не найден или ошибка
}
return false; // например, некорректный id
}
$result = findUser(0);
var_dump($result);
NULL
Тип возврата объявлен как User|false|null - функция может вернуть объект, логическое false или null. Это удобнее, чем смешивать разные типы без объявления.
Match с возвратом в разных контекстах
$value = 5;
$result = match (true) {
$value < 0 => 'Отрицательное',
$value === 0 => 'Ноль',
$value > 0 && $value <= 10 => 'Маленькое положительное',
$value > 10 => 'Большое',
};
echo $result; // Маленькое положительное
Конструкция match (true) позволяет использовать произвольные условия вместо сравнения с одним значением. Каждая ветка вычисляется как логическое выражение.
Nullsafe оператор в цепочке глубоких вызовов
$order = new Order();
$city = $order?->getUser()?->getAddress()?->city ?? 'Неизвестно';
echo $city;
Если любой из методов возвращает null, цепочка прерывается, и результат равен null, после чего оператор ?? подставляет значение по умолчанию. При использовании обычных вызовов -> на null возникла бы ошибка.
str_contains с кириллицей и многобайтовыми строками
$text = 'Привет, мир!';
// str_contains работает с однобайтовыми кодировками, для UTF-8 могут быть проблемы:
var_dump(str_contains($text, 'мир'));
// Надёжнее использовать mb_strpos:
var_dump(mb_strpos($text, 'мир') !== false);
bool(true) bool(true)
В PHP 8 str_contains корректно обрабатывает UTF-8, так как использует внутреннее представление строк. Однако в некоторых окружениях или при работе с необычными Unicode последовательностями может потребоваться mb_-функция.