Ответ
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- можно использовать в стрелочных функциях и других контекстах
Эти функции сделали код более выразительным, безопасным и производительным.
Ответ 18+ 🔞
А, ну вот, PHP 8, говоришь? Ёпта, это ж не просто обновление, это как будто тебе старый "Запорожец" в сервисе наконец-то заменили на что-то с двигателем и без дыр в полу. Овердохуища всего нового, честно.
Смотри, вот что реально вставило мозги в череп и заставило сказать "ёб твою мать, наконец-то".
1. Именованные аргументы (Named Arguments) Раньше, чтобы в функцию с кучей необязательных параметров что-то передать, надо было помнить порядок или городить массив. А теперь — красота. Смотри, как будто по имени зовёшь.
function createUser(string $name, string $email, ?int $age = null, bool $isActive = true) {
// ...
}
// Раньше бы писал createUser('Alice', 'user@example.com', null, false) и гадал, что где.
// А теперь — в рот мне чих-пых — просто и понятно.
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
Ну этот switch старый, он же вечно подводил, потому что case'ы "проваливались", если break забыть. Сплошное волнение ебать. А match — он строгий, умный и значение возвращает.
$statusCode = 404;
$message = match($statusCode) {
200, 201 => 'Success',
404 => 'Not Found',
500 => 'Server Error',
default => 'Unknown Status'
};
// И всё. Никаких провалов, строгое сравнение. Ни хуя себе, как просто.
4. Объединённые типы (Union Types)
Раньше, если функция могла принять и строку, и число, надо было писать докблок @param и молиться. А теперь можно прямо в коде указать — принимай, сука, вот эти типы и не выёбывайся.
function processInput(int|string|float $input): int|string {
if (is_numeric($input)) {
return (int) $input;
}
return strtoupper((string) $input);
}
Прямо в сигнатуре видно, что тут можно. Доверия к коду — сразу больше, хотя всё равно ноль ебать, но хоть так.
5. Оператор безопасного null (Nullsafe Operator)
Это святое, блядь. Сколько нервов потрачено на проверки if ($obj !== null && $obj->getSomething() !== null). Теперь — одна строчка.
// До PHP 8 — этот ад с вложенными проверками.
$country = null;
if ($user !== null && $user->getAddress() !== null) {
$country = $user->getAddress()->getCountry();
}
// PHP 8 — элегантно, как хуй в пальто.
$country = $user?->getAddress()?->getCountry();
Если на каком-то этапе null — цепочка обрывается и всё. Гениально и просто.
6. Атрибуты (Attributes) Вместо этих ёбаных докблоков с аннотациями, которые парсились строками, теперь есть нормальные структурированные атрибуты. Выглядит солидно.
#[Route('/api/users', methods: ['GET'])] // Вместо @Route
#[Middleware(AuthMiddleware::class)]
class UserController {
#[Inject(Database::class)] // Вместо @Inject
private $db;
}
Чище, понятнее, и IDE их лучше понимает.
Ну и по мелочи:
- JIT-компилятор — для тяжёлой математики скорость поднял, но для обычного веба разницы не очень заметил, честно.
str_contains()и компания — наконец-то, блядь, встроенные функции, чтобы не писатьstrpos(...) !== false. Проще простого.WeakMap— для продвинутых, чтобы кеш без утечек памяти делать.- Выражение
throw— теперь ошибку можно выбросить прямо в стрелочной функции или в тернарном операторе. Удобно.
В общем, PHP 8 — это серьёзный апгрейд. Код писать стало приятнее, он безопаснее и читабельнее. Как будто язык наконец-то вырос из коротких штанишек.