Какие интересные функции появились в 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 - можно использовать в стрелочных функциях и других контекстах

Эти функции сделали код более выразительным, безопасным и производительным.