Какие ключевые RFC были приняты и реализованы в PHP 8?

«Какие ключевые RFC были приняты и реализованы в PHP 8?» — вопрос из категории PHP Core, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

PHP 8 — это мажорное обновление, принесшее множество улучшений синтаксиса и производительности. Вот ключевые RFC, которые я активно использую в своей работе:

  1. RFC: Named Arguments (wiki.php.net/rfc/named_params) Позволяет передавать аргументы в функцию по имени, улучшая читаемость, особенно для функций с множеством необязательных параметров.

    // Было: непонятно, что такое false и true
    htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false);
    // Стало: ясная семантика
    htmlspecialchars($string, double_encode: false);
  2. RFC: Union Types (wiki.php.net/rfc/union_types_v2) Позволяет указывать несколько допустимых типов для параметров, возвращаемых значений и свойств.

    public function process(int|string $id): User|false {
        // $id может быть integer или string
    }
  3. RFC: Match Expression (wiki.php.net/rfc/match_expression_v2) Более мощная и безопасная замена switch. Возвращает значение, использует строгое сравнение (===).

    $statusCode = 404;
    $message = match ($statusCode) {
        200, 201 => 'OK',
        404 => 'Not Found',
        500 => 'Server Error',
        default => 'Unknown Status Code',
    };
    // $message = 'Not Found'
  4. RFC: Constructor Property Promotion (wiki.php.net/rfc/constructor_promotion) Сокращает шаблонный код для инициализации свойств через конструктор.

    // Было:
    class User {
        private string $name;
        public function __construct(string $name) { $this->name = $name; }
    }
    // Стало:
    class User {
        public function __construct(private string $name) {}
    }
  5. RFC: Nullsafe Operator (wiki.php.net/rfc/nullsafe_operator) Позволяет безопасно строить цепочки вызовов, где любой элемент может быть null.

    // Было: проверки на каждом уровне
    $country = null;
    if ($user !== null && $user->getAddress() !== null) {
        $country = $user->getAddress()->getCountry();
    }
    // Стало: лаконично и безопасно
    $country = $user?->getAddress()?->getCountry();
  6. RFC: Attributes (wiki.php.net/rfc/attributes_v2) Нативная замена док-блоков аннотаций для добавления метаданных к классам, методам и свойствам.

    #[Route('/api/users', methods: ['GET'])]
    class UserController {
        #[Autowired]
        private UserService $service;
    }

Также важными являются JIT-компиляция (RFC для улучшения производительности), новые строковые функции (str_contains, str_starts_with), тип mixed и улучшения системы типов. Эти изменения сделали PHP более выразительным, строгим и производительным языком.