Полезные новинки в PHP 8.x
В PHP регулярно появляются новые функции и улучшения, особенно в последних версиях (например, PHP 8.x). Вот несколько полезных нововведений и фишек, которые были добавлены в последние версии PHP
1. Nullsafe оператор (?->) — PHP 8.0
Раньше, для того чтобы избежать ошибки при обращении к методу или свойству объекта, который может быть null, приходилось писать громоздкий код с проверками. Теперь это можно сделать гораздо проще.
// Без nullsafe оператора: if ($user !== null && $user->getAddress() !== null) { $city = $user->getAddress()->city; } // С nullsafe оператором: $city = $user?->getAddress()?->city;
2. Match выражения — PHP 8.0
Match — это более мощная и строгая альтернатива switch. В отличие от switch, match возвращает результат и строго проверяет значения, что делает его более безопасным и лаконичным.
$code = 200; $message = match ($code) { 200, 201 => 'Success', 400 => 'Bad Request', 404 => 'Not Found', default => 'Unknown', }; echo $message; // Выведет: Success
3. Named аргументы — PHP 8.0
Теперь можно передавать аргументы в функцию по имени, что упрощает работу с функциями с большим количеством аргументов, особенно если используются значения по умолчанию.
function createUser($name, $age = 18, $role = 'user') { echo "Name: $name, Age: $age, Role: $role"; } // Использование именованных аргументов: createUser(name: 'John', role: 'admin');
4. Функция str_contains — PHP 8.0
Появилась новая функция для проверки, содержит ли строка подстроку. Она намного более удобна, чем использование strpos.
$haystack = 'Hello, world!'; $needle = 'world'; if (str_contains($haystack, $needle)) { echo 'String contains the word "world".'; }
5. Функция fdiv для деления на ноль — PHP 8.0
fdiv позволяет избежать ошибки деления на ноль, возвращая INF, -INF, или NaN, в зависимости от входных данных.
echo fdiv(1, 0); // INF echo fdiv(-1, 0); // -INF echo fdiv(0, 0); // NaN
6. Конструкторы свойств в классах — PHP 8.0
В PHP 8.0 добавлена возможность объявления свойств прямо в сигнатуре конструктора, что сокращает количество кода.
class User { public function __construct( public string $name, public int $age, public string $role = 'user' ) {} } $user = new User('John', 25); echo $user->name; // John
7. Промоутеры свойств — PHP 8.1
Теперь можно использовать свойства внутри интерфейсов и трейтов, что делает их более гибкими.
interface Logger { } trait FileLogger { public string $file; } } class AppLogger implements Logger { use FileLogger; public function __construct(string $file) { } } $logger = new AppLogger('app.log');
8. Enumns (Перечисления) — PHP 8.1
Это мощный инструмент для создания структурированных наборов данных.
enum Status: string { case Draft = 'draft'; case Published = 'published'; case Archived = 'archived'; } function setStatus(Status $status) { echo "The status is {$status->value}"; } setStatus(Status::Published); // The status is published
9. Readonly свойства — PHP 8.1
readonly свойства могут быть установлены только один раз, и их нельзя изменять после инициализации.
class User { public function __construct( public readonly string $name ) {} } $user = new User('Alice'); // $user->name = 'Bob'; // Ошибка: нельзя изменить readonly свойство
10. Fibers — PHP 8.1
Фибры предоставляют примитив для работы с асинхронным кодом, что делает их полезными для таких задач, как создание каркасов для корутин.
$fiber = new Fiber(function(): void { $value = Fiber::suspend('pause'); echo "Resumed with value: $value\n"; }); echo $fiber->start(); // pause $fiber->resume('continue'); // Resumed with value: continue
11. Маскировка ошибок с помощью @ улучшена — PHP 8.0
Теперь ошибки, замаскированные с помощью оператора @, не подавляют критические ошибки, такие как ParseError или TypeError, что повышает безопасность кода.