Какие интересные функции появились в PHP 8?

Ответ

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 — это серьёзный апгрейд. Код писать стало приятнее, он безопаснее и читабельнее. Как будто язык наконец-то вырос из коротких штанишек.