Серия версий PHP 8

Обзор изменений в версиях PHP 8.0–8.5: новые функции, JIT, типы, атрибуты, операторы и другие важные обновления языка. Актуальный список для разработчиков.

Серия версий PHP 8

Быстрые ссылки
  • PHP 8.5clone как функция, #[NoDiscard], расширение URI, array_first/array_last.
  • PHP 8.4 — Хуки свойств, Pipe-оператор |>, асимметричная видимость, array_find.
  • PHP 8.3 — Типизированные константы, json_validate(), #[Override], улучшения Randomizer.
  • PHP 8.2readonly-классы, самостоятельные типы 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 и др.) теперь стабильны (сохраняют порядок равных элементов).

Фатальная ошибка для несовместимых сигнатур: Нарушение контракта наследования методов теперь всегда вызывает фатальную ошибку.


Опубликовано: