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 →