Ответ
PHP 8 принес множество значимых улучшений. Вот ключевые нововведения, которые я активно использую:
1. Named Arguments (Именованные аргументы) Позволяет передавать аргументы в функцию по имени, а не только по позиции. Это особенно полезно для функций с множеством необязательных параметров.
function createUser(string $name, string $email, ?int $age = null, bool $isActive = true) {
// ...
}
// Вызов только с нужными параметрами, порядок не важен
createUser(email: 'user@example.com', name: 'Alice', isActive: false);
2. Constructor Property Promotion (Продвижение свойств конструктора) Сокращает шаблонный код при объявлении и инициализации свойств класса.
// До PHP 8
class User {
private string $name;
private int $age;
public function __construct(string $name, int $age) {
$this->name = $name;
$this->age = $age;
}
}
// PHP 8
class User {
public function __construct(
private string $name,
private int $age
) {}
}
3. Match Expression (Выражение match)
Более мощная и безопасная альтернатива switch. Возвращает значение и обеспечивает строгую проверку типов.
$statusCode = 404;
$message = match($statusCode) {
200, 201 => 'Success',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown Status'
};
// Сравнение с switch (нет риска "проваливания" case)
4. Union Types (Объединённые типы) Позволяет указывать несколько возможных типов для параметров, возвращаемых значений и свойств.
function processInput(int|string|float $input): int|string {
if (is_numeric($input)) {
return (int) $input;
}
return strtoupper((string) $input);
}
5. Nullsafe Operator (Оператор безопасного null)
Упрощает цепочки вызовов, когда промежуточное значение может быть null.
// До PHP 8
$country = null;
if ($user !== null && $user->getAddress() !== null) {
$country = $user->getAddress()->getCountry();
}
// PHP 8
$country = $user?->getAddress()?->getCountry();
6. Attributes (Атрибуты) Структурированные метаданные для классов, методов, свойств и т.д. Альтернатива док-блокам с аннотациями.
#[Route('/api/users', methods: ['GET'])]
#[Middleware(AuthMiddleware::class)]
class UserController {
#[Inject(Database::class)]
private $db;
}
Другие важные улучшения:
- JIT-компилятор для повышения производительности CPU-интенсивных задач
str_contains(),str_starts_with(),str_ends_with()- удобные строковые функцииWeakMapдля кеширования без утечек памяти- Выражение
throw- можно использовать в стрелочных функциях и других контекстах
Эти функции сделали код более выразительным, безопасным и производительным.