Серия версий PHP 8
Обзор изменений в версиях PHP 8.0–8.5: новые функции, JIT, типы, атрибуты, операторы и другие важные обновления языка. Актуальный список для разработчиков.
Быстрые ссылки
- PHP 8.5 —
cloneкак функция,#[NoDiscard], расширение URI,array_first/array_last. - PHP 8.4 — Хуки свойств, Pipe-оператор
|>, асимметричная видимость,array_find. - PHP 8.3 — Типизированные константы,
json_validate(),#[Override], улучшенияRandomizer. - PHP 8.2 —
readonly-классы, самостоятельные типыnull,false,true, DNF-типы. - PHP 8.1 — Enums,
readonly-свойства,neverтип, Fibers. - PHP 8.0 — JIT, атрибуты, оператор Nullsafe,
match, Union Types.
PHP 8.5
Pipe-оператор |>: Новый оператор конвейера для цепочки вызовов функций в стиле value |> fn1() |> fn2().
clone как функция: Языковая конструкция clone теперь работает как функция с возможностью передать аргументы для переопределения свойств: clone($object, ['prop' => 'value']).
Функция curl_multi_get_handles: Возвращает массив всех дескрипторов CurlHandle, добавленных в мультидескриптор CurlMultiHandle.
Константа PHP_BUILD_DATE: Новая глобальная константа, содержащая дату и время сборки PHP.
Константа PHP_BUILD_PROVIDER: Новая глобальная константа, содержащая значение переменной окружения, заданной при сборке PHP.
Функции get_error_handler и get_exception_handler: Позволяют получить текущие обработчики ошибок и исключений.
Функции array_first и array_last: Извлекают первое и последнее значение из массива без изменения его состояния.
Директива max_memory_limit: Новая INI-директива INI_SYSTEM, задающая максимально допустимое значение для memory_limit.
Атрибут #[NoDiscard]: Позволяет пометить, что возвращаемое значение функции/метода важно и его игнорирование вызовет предупреждение.
Новое расширение URI: Добавлено стандартное расширение для парсинга URI/URL согласно RFC 3986 и WHATWG.
Атрибуты констант: Возможность добавлять атрибуты к константам классов (например, #[Deprecated]).
Замыкания в константных выражениях: Теперь можно использовать анонимные функции и callable в константах и атрибутах.
Трассировка стека для фатальных ошибок: Сообщения о фатальных ошибках теперь включают полный стек вызовов.
Функция grapheme_levenshtein: Вычисляет расстояние Левенштейна с учетом групп графем (юникод-символов).
Устарели __sleep() и __wakeup(): Магические методы помечены как устаревшие в пользу __serialize()/__unserialize().
Асимметричная видимость для статических свойств: Статические свойства теперь поддерживают разную видимость для чтения и записи.
OPCache всегда включен: Расширение OPcache стало обязательной и статически встроенной частью PHP.
final для свойств в конструкторе: Можно объявлять свойства в конструкторе как final.
Опция --ini=diff в CLI: Вывод только тех настроек php.ini, которые отличаются от значений по умолчанию.
Атрибут #[Deprecated] для трейтов: Теперь можно помечать трейты как устаревшие.
Функция locale_is_right_to_left: Определяет, использует ли локаль письмо справа налево (например, арабский).
Улучшенный класс Directory: Класс стал строгим, немодифицируемым ресурсным объектом.
#[Override] для свойств: Атрибут теперь можно применять к свойствам для проверки переопределения.
Устарели константы MHASH_: Все константы расширения mhash помечены устаревшими.
Устарели альтернативные приведения типов: Варианты (integer), (double), (boolean), (binary) устарели в пользу (int), (float), (bool), (string).
Удалены CLI-опции -z / --zend-extension: Параметры командной строки для загрузки Zend-расширений удалены.
PHP 8.4
Новый JIT-движок — оптимизирующий компилятор с промежуточным представлением, аналогичный Java HotSpot.
Отображение размера int в phpinfo() — показывает размер целого числа в битах в выводе phpinfo() и CLI.
Поддержка AEGIS в Sodium — добавлены алгоритмы AEGIS-128L и AEGIS256 для быстрого шифрования с проверкой подлинности.
Новые функции для массивов — array_find, array_find_key, array_all, array_any для поиска и проверки элементов.
Константы HTTP/3 в Curl — CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY для выполнения запросов по HTTP/3.
Функции для HTTP-заголовков — http_get_last_response_headers и http_clear_last_response_headers для работы с заголовками ответа.
Функция bcdivmod в BCMath — возвращает и частное, и остаток от деления за одну операцию.
Метод DateTime::createFromTimestamp — создает объект DateTime/DateTimeImmutable из UNIX-временной метки.
Методы get/setMicrosecond — новые методы в DateTime и DateTimeImmutable для работы с микросекундами.
Мультибайтовые функции trim — mb_trim, mb_ltrim, mb_rtrim для безопасной обрезки строк в кодировках.
Мультибайтовые функции ucfirst/lcfirst — mb_ucfirst и mb_lcfirst для изменения регистра первого символа.
Функция request_parse_body — парсит тело HTTP-запросов (PUT, DELETE, PATCH) в $_POST и $_FILES.
Хуки свойств — возможность определять get и set хуки для свойств классов.
Асимметричная видимость свойств — разная видимость свойства для чтения и записи (например, public readonly).
Синтаксис свойств в конструкторе — краткий синтаксис для объявления и инициализации свойств.
Ленивые объекты — встроенная поддержка для создания прокси-объектов с ленивой инициализацией.
Вывод feature_list в curl_version() — возвращает массив поддерживаемых функций Curl, а не битовую маску.
Новые режимы округления в round() — добавлены PHP_ROUND_CEILING, FLOOR, TOWARD_ZERO, AWAY_FROM_ZERO.
Улучшение обратных вызовов в DOM/XSL — улучшена поддержка вызываемых типов в XSLTProcessor и DOMXPath.
Exit/die как функции — языковые конструкции exit и die теперь являются функциями с особым поведением.
Пропуск скобок в new — можно опускать дополнительные круглые скобки при создании экземпляра класса.
Сложность Bcrypt увеличена до 12 — параметр cost по умолчанию изменен для повышения стойкости паролей.
Отключение JIT по умолчанию — изменены значения по умолчанию: opcache.jit=disable, opcache.jit_buffer_size=64M.
Тип PHP_ZTS и PHP_DEBUG изменен на bool — константы теперь возвращают логические значения, а не целые.
Минимальная версия OpenSSL 1.1.1 — повышена минимальная требуемая версия библиотеки OpenSSL.
Устарели неявные nullable-типы — типы со значением null по умолчанию, но без ? объявления, теперь устарели.
Устарела константа CURLOPT_BINARYTRANSFER — константа более не имеет эффекта и помечена как устаревшая.
Устарела константа E_STRICT — использование этой константы теперь вызывает уведомление об устаревании.
Устарел вызов session_set_save_handler() с >2 аргументами — устарел устаревший вариант вызова функции.
Удалено из ядра (в PECL) — расширения Pspell, IMAP, OCI8 и PDO_OCI перемещены в репозиторий PECL.
Минимальная версия libcurl 7.61.0 — повышена минимальная поддерживаемая версия библиотеки libcurl.
Обновлена база символов Unicode в mbstring — обновлена до версии 16 в расширении mbstring.
Исключения в round() — недопустимые режимы округления теперь вызывают исключение ValueError.
PHP 8.3
Исправления для readonly-классов: Можно переинициализировать readonly-свойства внутри метода __clone() для глубокого клонирования.
Типизированные константы класса: Константы в классах, интерфейсах и трейтах теперь могут объявляться с указанием типа.
Атрибут #[Override]: Позволяет явно отметить метод, переопределяющий родительский, для раннего обнаружения ошибок.
Отрицательные индексы в массивах: Пустой массив теперь учитывает отрицательный индекс при добавлении последующих элементов.
Анонимные readonly-классы: Анонимные классы теперь могут быть объявлены как readonly.
Новая функция json_validate(): Быстрая и экономичная по памяти проверка валидности JSON-строки.
Динамический доступ к константам и Enum: Синтаксис ClassName::{$varName} и EnumName::{$varName} теперь разрешен.
Расширенная gc_status(): Возвращает новую информацию о состоянии сборщика мусора.
Randomizer::getBytesFromString(): Генерирует строку случайных байтов только из заданного набора символов.
Randomizer::getFloat() и nextFloat(): Новые методы для генерации случайных чисел с плавающей точкой.
Проверка синтаксиса нескольких файлов:php -l теперь принимает несколько файлов для проверки за один вызов.
Специфичные исключения для DateTime: Добавлены новые классы исключений для ошибок работы с датой/временем.
Строгие предупреждения для unserialize(): При ошибках теперь выбрасывается E_WARNING вместо E_NOTICE.
Трейты и статические свойства: Трейты больше не делят статические свойства с родительским классом.
Обнаружение переполнения стека: Новые директивы zend.max_allowed_stack_size для контроля глубины вызовов.
Новая функция mb_str_pad(): Мультибайтовый аналог str_pad() для корректной работы с UTF-8.
Новая функция stream_context_set_options: Отдельная функция для установки опций контекста из массива.
Замыкания магических методов: Теперь поддерживают использование именованных аргументов.
Инвариантная видимость констант: Проверяется соответствие видимости констант при реализации интерфейса.
class_alias() для встроенных классов: Теперь можно создавать псевдонимы для внутренних классов PHP.
PHP 8.2
Самостоятельные типы null, false и true: Теперь их можно использовать как отдельные типы или в составе union-типов.
Классы readonly: Ключевое слово readonly для класса делает все его свойства доступными только для чтения.
Новое расширение Random: Представлен класс \Random\Randomizer с улучшенными, безопасными и тестируемыми генераторами случайных чисел.
Типы в ДНФ (дизъюнктивной нормальной форме): Разрешено комбинировать intersection- и union-типы с группировкой скобками (например, (A&B)|C).
Константы в трейтах: Трейты теперь могут содержать константы, доступные через класс, который их использует.
Доступ к свойствам Enum в константных выражениях: Разрешено использовать -> и ?-> для получения свойств Enum в константах.
Динамические свойства устарели: Присвоение значения необъявленному свойству объекта вызывает уведомление об устаревании.
Сенситивные параметры в стектрейсах: Параметры, помеченные атрибутом \SensitiveParameter, маскируются в выводе исключений.
Изменение типа возврата createFromMutable/Immutable: Методы в DateTime и DateTimeImmutable теперь возвращают static.
str_split('') возвращает пустой массив: Функция больше не возвращает массив с одной пустой строкой для пустого входа.
Изменение порядка сортировки ksort с SORT_REGULAR: Числовые ключи теперь сортируются перед строковыми.
Устарели utf8_encode() и utf8_decode(): Эти функции помечены как устаревшие из-за неточного имени и ограниченной функциональности.
Устарели частично поддерживаемые callable: Callable-синтаксисы, зависящие от контекста (например, "self::method"), помечены устаревшими.
Нечувствительные к локали strtolower()/strtoupper(): Эти функции больше не зависят от локали; для этого используйте mb_strtolower/upping().
Устарела интерполяция ${var} и ${expr}: Старый стиль интерполяции строк помечен как устаревший.
Изменены сигнатуры методов в SPL: Некоторые методы в классах SPL теперь имеют правильные объявления типов.
Новый модификатор n в PCRE: Добавлена поддержка модификатора NO_AUTO_CAPTURE в функциях PCRE.
Экранирование учетных данных в ODBC: Расширение ODBC теперь корректно экранирует имя пользователя и пароль.
MySQLi без libmysql: Расширение mysqli больше не может быть скомпилировано с устаревшей библиотекой libmysql.
PHP 8.1
Распаковка массивов со строковыми ключами: Оператор ... теперь работает с массивами, содержащими строковые ключи, по аналогии с array_merge.
Новый тип never: Указывает, что функция никогда не вернет управление (завершит скрипт или выбросит исключение).
Функция array_is_list: Проверяет, является ли массив списком с последовательными целочисленными ключами, начиная с 0.
Функции fsync и fdatasync: Новые функции для принудительной синхронизации файловых изменений на диск.
Явное восьмеричное обозначение: Можно использовать префиксы 0o или 0O для записи восьмеричных чисел.
Перечисления (Enums): Добавлена поддержка перечислений как типа данных на уровне языка.
Файберы (Fibers): Низкоуровневый примитив для управления легковесной конкурентностью.
Улучшенный кеш наследования в OPcache: Увеличивает производительность на 5-8% за счет кеширования связей между классами.
Ключевое слово new в инициализаторах: Можно использовать new для аргументов по умолчанию, атрибутов и других мест.
Свойства только для чтения: Свойства класса можно объявить как readonly, что позволяет записать их только один раз.
Синтаксис Callable(...): Новый синтаксис для создания замыкания из вызываемого объекта (callable).
Типы пересечений (Intersection Types): Можно указывать, что значение должно соответствовать нескольким типам одновременно (например, Foo&Bar).
Константы класса final: Константы класса теперь можно объявлять как final, чтобы запретить их переопределение.
Новый ключ full_path в $_FILES: Для загрузки директорий содержит полный путь, переданный браузером.
Устарела передача null в не-null аргументы внутренних функций: Вызовет уведомление об устаревании.
Ограничение записи в $GLOBALS: Запрещена прямая модификация $GLOBALS как массива и передача по ссылке для повышения производительности.
Ресурсы преобразованы в объекты: Ресурсы finfo и IMAP теперь являются объектами.
Устарела автовивификация false: Создание массива из значения false теперь вызывает уведомление.
Внутренние методы используют правильные типы возврата: Многие встроенные классы теперь объявляют типы возврата, что может повлиять на пользовательские расширения.
PHP 8.0
JIT (Just-In-Time компилятор): Добавлен JIT-компилятор, обещающий значительный прирост производительности для определенных типов нагрузок.
Union Types (Объединенные типы): Возможность указывать, что значение может принадлежать к одному из нескольких типов (например, int|float).
Оператор Nullsafe (?->): Позволяет безопасно вызывать методы и получать свойства, не проверяя каждый раз на null.
Именованные аргументы: Передача аргументов в функцию по имени, а не по порядку, что позволяет пропускать необязательные параметры.
Атрибуты (Attributes): Добавлен синтаксис для декларативных метаданных к классам, методам, свойствам и т.д.
Выражение match: Более мощная и безопасная замена switch, возвращающая значение и использующая строгое сравнение.
Объявление свойств в конструкторе: Синтаксический сахар для одновременного объявления свойств класса и их инициализации в конструкторе.
Новый тип возврата static: Можно указывать, что метод возвращает экземпляр того класса, из которого он был вызван.
Новый тип mixed: Явное указание типа, который может быть любым из встроенных типов PHP.
throw как выражение: Ключевое слово throw теперь можно использовать в контекстах, где разрешены выражения (например, в тернарном операторе).
Наследование приватных методов: Проверка совместимости сигнатур методов больше не применяется к private методам.
WeakMap: Новая структура данных, хранящая слабые ссылки на объекты, не препятствуя их сборке мусора.
::class на объектах: Можно использовать $object::class для получения имени класса, аналогично get_class($object).
Неперехваченные исключения: Синтаксис catch (Exception) без указания переменной для исключения.
Завершающая запятая в списках параметров: В вызовах функций и методов теперь можно ставить запятую после последнего аргумента.
Создание DateTime из интерфейса: Добавлены методы createFromInterface() для взаимного преобразования DateTime и DateTimeImmutable.
Интерфейс Stringable: Автоматически добавляется классам с методом __toString(). Можно использовать в типах (string|Stringable).
str_contains(): Проверяет, содержит ли строка подстроку. Замена для strpos().
str_starts_with() и str_ends_with(): Проверяют, начинается или заканчивается ли строка заданной подстрокой.
fdiv(): Функция деления, возвращающая INF, -INF или NAN при делении на ноль.
get_debug_type(): Возвращает тип переменной в более читаемом формате, чем gettype().
get_resource_id(): Возвращает целочисленный идентификатор ресурса.
Улучшены абстрактные методы в трейтах: Теперь проверяется совместимость сигнатур реализаций абстрактных методов трейтов.
Объектно-ориентированный API для токенизатора: Класс PhpToken как альтернатива функции token_get_all().
Типизированные внутренние функции: Аннотации типов для всех встроенных функций.
Расширение ext-json всегда доступно: JSON больше нельзя отключить при компиляции PHP.
Согласованные ошибки типов: Внутренние функции теперь выбрасывают TypeError, как и пользовательские.
Переклассификация предупреждений: Многие предупреждения (E_WARNING, E_NOTICE) преобразованы в исключения (Error, TypeError).
Оператор @ не подавляет фатальные ошибки: Оператор подавления ошибок больше не работает для критических ошибок.
Режим ошибок PDO по умолчанию: Теперь установлен в PDO::ERRMODE_EXCEPTION.
Уровень отчетов об ошибках по умолчанию: Установлен в E_ALL (вместо маски, скрывающей уведомления и устаревшие функции).
Изменен приоритет конкатенации: Оператор . теперь имеет более низкий приоритет, чем + и -.
Строгие проверки типов для операторов: Арифметические и побитовые операторы больше не работают с массивами/объектами.
Пространства имен как один токен: Зарезервированные слова можно использовать в пространствах имен.
Строгие сравнения чисел и строк: Сравнения вроде 0 == "not-a-number" теперь возвращают false.
Стабильная сортировка: Все функции сортировки (sort, asort и др.) теперь стабильны (сохраняют порядок равных элементов).
Фатальная ошибка для несовместимых сигнатур: Нарушение контракта наследования методов теперь всегда вызывает фатальную ошибку.
Опубликовано:


