Открыть сервис

PHP 8

PHP 8 — это мажорная версия скриптового языка программирования общего назначения PHP, выпущенная 26 ноября 2020 года. Она представляет собой значительный шаг в развитии языка, внедрив ряд фундаментальных нововведений, включая JIT-компиляцию (Just-In-Time), атрибуты, именованные аргументы, улучшенную систему типов и множество синтаксических улучшений. PHP 8 разрабатывался как эволюционное обновление, направленное на повышение производительности, надёжности и удобства разработки, сохраняя при этом обратную совместимость с предыдущими версиями (в основном с PHP 7.x).

История и предпосылки

Разработка PHP 8 началась вскоре после выхода PHP 7.4 в ноябре 2019 года. Основной предпосылкой стало стремление команды разработчиков (PHP Internals) реализовать давно запланированные, но отложенные функции, такие как JIT-компиляция и атрибуты, а также исправить накопившиеся проблемы с дизайном языка. Процесс разработки проходил в открытом режиме с использованием RFC (Request for Comments) — официального механизма предложения и обсуждения изменений.

Ключевым этапом стало принятие RFC по JIT-компиляции, предложенного Дмитрием Стоговым, который работал над этой технологией в рамках проекта PHP. Выход первой альфа-версии состоялся в июне 2020 года, а финальный релиз — 26 ноября 2020 года. В отличие от PHP 7, который был сфокусирован на оптимизации производительности движка Zend Engine, PHP 8 сосредоточился на расширении возможностей языка и улучшении качества кода.

Основные нововведения

JIT-компиляция (Just-In-Time)

Самое значительное техническое нововведение PHP 8 — это JIT-компилятор. В предыдущих версиях PHP код сначала компилировался в байт-код (opcode), а затем выполнялся виртуальной машиной Zend VM. JIT-компилятор позволяет во время выполнения преобразовывать наиболее часто используемые участки байт-кода непосредственно в машинный код процессора, что значительно ускоряет выполнение вычислительно сложных задач.

JIT в PHP 8 реализован на основе библиотеки DynASM и может работать в двух режимах:

  • Tracing JIT — отслеживает выполнение циклов и компилирует их целиком.
  • Function JIT — компилирует отдельные функции, которые часто вызываются.

На практике JIT-компиляция даёт наибольший прирост производительности в синтетических тестах (бенчмарках) и вычислительных задачах (например, математические расчёты, обработка изображений). Для типичных веб-приложений, где узким местом часто является ввод-вывод (базы данных, файловая система), прирост производительности от JIT менее заметен — обычно от 5% до 15%.

Атрибуты (Attributes)

Атрибуты (также известные как аннотации) — это механизм добавления метаданных к классам, методам, свойствам, функциям и константам. В предыдущих версиях PHP для этой цели использовались doc-блоки (комментарии /** @var ... */), которые не были частью синтаксиса языка и обрабатывались сторонними библиотеками через рефлексию.

В PHP 8 атрибуты стали частью языка. Они объявляются с помощью синтаксиса #[...] и могут быть прочитаны через API Reflection. Это позволяет фреймворкам и библиотекам (например, Symfony, Doctrine) получать метаданные без парсинга комментариев, что делает код более надёжным и быстрым.

Пример: ```php

[Route('/api/users', methods: ['GET'])]

class UserController { ... } ```

Именованные аргументы (Named Arguments)

Именованные аргументы позволяют передавать значения в функцию, указывая имя параметра, а не его позицию в списке. Это решает проблему с функциями, имеющими много необязательных параметров, и улучшает читаемость кода.

Пример: ``php // Вместо htmlspecialchars($string, ENT_COMPAT | ENT_HTML401, 'UTF-8', false); // Можно писать htmlspecialchars($string, double_encode: false); ``

Улучшенная система типов

PHP 8 значительно расширил систему типов, что является частью долгосрочной стратегии по превращению PHP в язык со строгой типизацией по желанию разработчика.

  • Union Types (объединённые типы) — позволяет указать, что переменная может принимать значения из нескольких типов. Например: int|string $value.
  • Mixed Type (смешанный тип) — эквивалент object|resource|array|string|int|float|bool|null. Введён как явная альтернатива отсутствию типа.
  • Static Return Type (статический возвращаемый тип) — позволяет указать, что метод возвращает экземпляр класса, из которого он был вызван (позднее статическое связывание).
  • Weak Maps (слабые карты) — специальный класс WeakMap, который позволяет хранить ссылки на объекты, не препятствуя их сборке мусора. Это полезно для кэширования метаданных без риска утечки памяти.

Синтаксические улучшения

  • Match-выражение — более мощная и лаконичная альтернатива switch. В отличие от switch, match возвращает значение, не требует оператора break и поддерживает строгое сравнение (===).
  • Nullsafe-оператор (?->) — позволяет безопасно обращаться к методам и свойствам объекта, который может быть null. Если объект null, вся цепочка вызовов прерывается и возвращается null.
  • Конструктор с продвижением свойств (Constructor Property Promotion) — позволяет объявлять и инициализировать свойства класса прямо в списке параметров конструктора, сокращая шаблонный код.
  • Non-capturing catches — позволяет игнорировать переменную исключения в блоке catch, если она не нужна: catch (SomeException) { ... }.
  • str_contains(), str_starts_with(), str_ends_with() — новые строковые функции, которые проверяют наличие подстроки в строке, заменяя более громоздкие конструкции с strpos().

Классификация версий

PHP 8 имеет несколько минорных версий, каждая из которых добавляла новые функции и исправления:

  • PHP 8.0 (ноябрь 2020) — первый релиз с JIT, атрибутами, именованными аргументами, union types, match-выражением, nullsafe-оператором.
  • PHP 8.1 (ноябрь 2021) — добавил перечисления (Enums), Fibers (для асинхронного программирования), readonly-свойства, intersection types, new в инициализаторах.
  • PHP 8.2 (декабрь 2022) — ввёл readonly-классы, тип null и false как самостоятельные типы, константы в трейтах, улучшения в системе типов.
  • PHP 8.3 (ноябрь 2023) — добавил глубокое клонирование readonly-свойств, json_validate(), mb_str_pad(), Override-атрибут.
  • PHP 8.4 (ноябрь 2024) — последняя на данный момент минорная версия. Включает property hooks (свойства-хуки), асимметричную видимость, улучшенный JIT, новый синтаксис для анонимных классов.

Применение и значение

PHP 8 является текущей стабильной версией языка и широко используется в веб-разработке. Он поддерживается всеми основными фреймворками: Laravel, Symfony, Yii, CodeIgniter, WordPress (начиная с версии 5.6). Переход на PHP 8 рекомендуется для всех проектов, так как он обеспечивает более высокую производительность, улучшенную безопасность и современный синтаксис.

Нововведения PHP 8, такие как JIT-компиляция, делают его более конкурентоспособным в областях, где PHP традиционно уступал (например, в высоконагруженных вычислениях). Атрибуты и улучшенная система типов способствуют написанию более чистого, самодокументируемого и поддерживаемого кода. Внедрение именованных аргументов и match-выражения снижает количество ошибок, связанных с порядком параметров и неявным приведением типов.

Критика и ограничения

Несмотря на значительные улучшения, PHP 8 не лишён критики. Основные замечания касаются:

  • Сложность JIT — для большинства веб-приложений прирост производительности от JIT незначителен, а его реализация усложняет поддержку движка. Некоторые разработчики считают, что усилия стоило направить на другие оптимизации.
  • Обратная совместимость — хотя PHP 8 сохраняет высокую степень обратной совместимости, некоторые устаревшие функции (например, each(), create_function()) были удалены, что потребовало обновления кода в старых проектах.
  • Сложность типов — некоторые разработчики считают, что чрезмерное усложнение системы типов (intersection types, union types, mixed) делает язык менее доступным для новичков и увеличивает когнитивную нагрузку.
  • Асинхронность — несмотря на появление Fibers в PHP 8.1, модель асинхронного программирования в PHP остаётся менее зрелой по сравнению с языками вроде JavaScript (Node.js) или Go.

Источники

  • Официальная документация PHP: PHP Manual, раздел «PHP 8.0 — 8.4»
  • PHP Internals Wiki: RFCs for PHP 8.0, 8.1, 8.2, 8.3, 8.4
  • Книга: «PHP 8: The Modern Web Developer's Guide» (2021)
  • Статья: «PHP 8.0: What's New and What's Changed» (JetBrains Blog, 2020)
  • Статья: «JIT in PHP 8: A Deep Dive» (Dmitry Stogov, 2020)

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →