Что нового в PHP 8.4
PHP 8.4, был выпущен 21 ноября 2024 года
Когда выйдет PHP 8.4?
PHP 8.4, был официально выпущен 21 ноября 2024 года.
Как установить и протестировать PHP 8.4?
Установить можно по аналогии с установкой PHP 8.3 заменив версию на правильную.
Новый JIT-движок
Как вы знаете JIT появился в PHP 8.0 и представлял из себя компиляцию "на лету" - Just In Time, в PHP 8.4 будет новый JIT-движок. Теперь это настоящий оптимизирующий компилятор с промежуточным представлением, аналогичный серверному компилятору Java HotSpot
phpinfo отображает информации о размере целочисленного типа (int) PR
Вывод phpinfo() в PHP 8.4 показывает размер целого числа, поддерживаемый текущей настройкой PHP в битах, также включается в выходные данные PHP CLI:

Ранее все предыдущие версии (начиная с PHP 5.0.5) поддерживали константы PHP_INT_SIZE для определения размера целого числа.
Поддержка AEGIS-128L и AEGIS256 в Sodium
AEGIS - это семейство алгоритмов шифрования с проверкой подлинности на основе AES, которые работают быстрее, чем AES-GCM. Расширение Sodium в PHP 8.4 поддерживает алгоритмы шифрования AEGIS-128L и AEGIS256, если расширение Sodium скомпилировано с версией libsodium 1.0.19 или новее. Расширение Sodium в PHP 8.4 добавляет шесть новых функций и четыре новые константы PHP для AEGIS-128L и AEGIS-256AEAD.
Новые функции array_find, array_find_key, array_any, array_all RFC
В PHP 8.4 добавлены четыре новые функции для работы с массивами, для поиска и проверки элементов с помощью функции обратного вызова:
array_find - Возвращает значение первого элемента из массива, для которого возвращается результат callback = true;
array_find_key - Возвращает ключ первого элемента из массива, для которого возвращается результат callback = true;
array_all - Возвращает true, если все элементы в массиве соответствует условию callback
array_any - Возвращает true, если хотя бы один элемент в массиве соответствует условию callback
Новые константы для Curl CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY для поддержки HTTP/3
Расширение PHP Curl способно выполнять HTTP-запросы HTTP/3 (также известный как QUIC), если расширение Curl скомпилировано с необходимыми зависимостями для HTTP/3. В PHP 8.4 расширение Curl объявляет две следующие новые константы PHP, которые являются принятыми параметрами для CURLOPT_HTTP_VERSIONопции Curl.
CURL_HTTP_VERSION_3 ( = int 30)
CURL_HTTP_VERSION_3ONLY ( = int 31)
Новые функции http_get_last_response_headers и http_clear_last_response_headers
В PHP 8.4 добавлены две новые функции, http_get_last_response_headers и http_clear_last_response_headers, которые можно использовать для получения и очистки HTTP-заголовков последнего HTTP ответа, которые могут заменить легендарную переменную $http_response_header.
Новая функция bcdivmod в расширении BCMath
Расширение BCMath в PHP 8.4 представляет новую функцию bcdivmod которая делит заданное число на заданный делитель и возвращает как частное, так и остаток, и это позволяет избежать необходимости вызывать функции bcdiv и bcmod по отдельности:
Новый метод DateTime createFromTimestamp
До PHP 8.4, чтобы создать экземпляр DateTime или DateTimeImmutable из временной метки UNIX, его нужно было создать с помощью createFromFormat:
С PHP 8.4 классы DateTime и DateTimeImmutable в PHP 8.4 имеют новый метод createFromTimeStamp, позволяющий легко создать экземпляр из заданной временной метки UNIX в виде целого числа или значения с плавающей запятой.
Новые методы DateTime(Immutable)::get/setMicrosecond
Теперь классы DateTime и DateTimeImmutable в PHP 8.4 и более поздних версиях будут поддерживать методы getMicrosecond и setMicrosecond для получения и установки количества микросекунд для объектов DateTime/ DateTimeImmutable:
Новые функции mbstring: mb_trim, mb_ltrim, и mb_rtrim
В PHP 8.4 будут добавлены эквивалентные мультибайтные функции существующих trim, ltrim, и rtrim:
Новые функции mb_ucfirst и mb_lcfirst
В PHP есть функции ucfirst и lcfirst для изменения регистра первого символа в заданной строке. В PHP 8.4 расширение mbstring добавляет функции mb_ucfirst и mb_lcfirst в качестве многобайтовых безопасных альтернатив функциям ucfirst и lcfirst:
Новая функция request_parse_body
В PHP 8.4 добавлена новая функция request_parse_body, которая предоставляет встроенную функциональность анализа запросов для других методов HTTP-запросов,таких как например PUT, DELETE
и PATCH
. Функция request_parse_body считывает все содержимое, которое доступно в потоке php://input и создает значения, которые можно использовать в переменных $_POST и $_FILES:
Хуки свойств
Итак, наконец-то долгожданная обнова случилась и в PHP 8.4 у нас появятся полноценные свойства, с возможностью задавать хуки get и set (а в будущем и не только их):
Что примечательно, благодаря этому RFC так же можно асимметрично объявлять публичные свойства в интерфейсах. Класс реализации может предоставить свойство через обычное свойство или хуки:
Ассиметричная видимость свойств RFC
Одной из интересной особенностью PHP 8.4 является асимметричная видимость. Асимметричная видимость позволяет свойствам класса определять свою видимость (public, protected, или private) на основе контекста чтения или записи. Наиболее распространенным примером асимметричной видимости являются публичные свойства, которые можно изменять только изнутри класса. Такое свойство будет выглядеть следующим образом:
Поскольку публичные свойства, которые могут быть изменены только в частном контексте, являются наиболее распространенным вариантом использования асимметричной видимости, также доступна сокращенная запись:
И конечно же, вы также можете сделать свойства доступными для записи только в пределах protected области:
Синтаксис для свойств в конструкторе:
Lazy (ленивые) объекты RFC
В PHP 8.4 наконец-то добавлена встроенная поддержка ленивых объектов - распространенного шаблона, используемого фреймворками для создания прокси-объектов, ленивая загрузка объектов в PHP уже используется в критически важных для бизнеса ситуациях. Например, Symfony использует их в своем компоненте внедрения зависимостей для предоставления ленивых сервисов, которые полностью инициализируются только при необходимости. Некоторые ORM делает свои сущности ленивыми, позволяя объектам гидратировать себя из базы данных только при обращении.
Вывод feature_list в функции curl_version() расширения Curl
Функция curl_version в расширении Curl возвращает ассоциативный массив, содержащий информацию о версии и сборке Curl. Сюда входит версия Curl, имя и версия библиотеки SSL, версии Brotli и libz, список протоколов, поддерживаемых сборкой Curl, и битовая маска всех функций, поддерживаемых Curl. Битовая маска функций не позволяет интуитивно обнаружить и легко проверить, поддерживается ли конкретная функция (например, HTTP/2, HSTS и т. д.) в Curl.
В PHP 8.4 функция curl_version возвращает дополнительный ключ массива с именем feature_list, содержащий массив функций Curl и информацию о том, поддерживаются ли они:
Новые режимы округления в функции round()
Функция round() округляет значение с плавающей точкой до ближайшего целого числа или десятичного значения указанной точности. Она поддерживает различные режимы округления, а PHP 8.4 добавляет четыре новых метода округления:
PHP_ROUND_CEILING: Округляет число до ближайшего целого числа, большего, чем число, превращая 1.1 и 1.5 в 2, а -1.1 и -1.5 в -1.
PHP_ROUND_FLOOR: Округляет число до ближайшего целого числа, меньшего числа, превращая 1.1 и 1.9 в -1 , а -1.9 и -1.1 в -2. Возвращаемое значение идентично возвращаемому значению функции floor.
PHP_ROUND_TOWARD_ZERO: Округляет число в сторону нуля, превращая 1.9 и 1.1 в 1, а -1.9 и -1.9 в -1.
PHP_ROUND_AWAY_FROM_ZERO: Округляет число от нуля, превращая 1.1 и 1.9 в 2, а -1,1 и -1.9 в -2 .
Улучшение обратных вызовов в ext/dom и ext/xsl
В PHP 8.4 будет улучшена поддержка вызываемых типов XSLTProcessor::registerPHPFunctions() и DOMXPath::registerPhpFunctions() методов:
Изменения синтаксиса/функциональности
Exit/die переход с языковых конструкций на функции
Ключевое слово exit и его псевдоним die - это языковые конструкции, которые выводят сообщение и завершают текущий скрипт. В приложениях CLI exit/die может использоваться для завершения приложения с заданным кодом выхода. В PHP 8.4 exit/die будут являться функциями. Они будет иметь специальную обработку, позволяющую вызывать их без скобок для обеспечения обратной совместимости со старыми приложениями:
Создание экземпляров класса без дополнительных круглых скобок
В PHP 8.4 появилась возможность опускать дополнительные скобки при new выражении, т.е. вместо:
можно писать такой синтаксис:
Хеширование паролей: алгоритмическая сложность Bcrypt по умолчанию изменена с 10 на 12
В PHP 8.4 параметр cost алгоритма PASSWORD_BCRYPT/PASSWORD_DEFAULT изменился с 10 на 12, чтобы сделать пароли более устойчивыми и сложными.
Это изменение по существу эквивалентно:
Способ отключения JIT по умолчанию rfc
До PHP 8.4 JIT был отключен по умолчанию, используя значение по умолчанию opcache.jit_buffer_size=0 вместо opcache.jit=disable. Это фактически отключает JIT не потому, что jit=disable, а потому что размер буфера установлен равный 0.
В этом RFC предлагается изменить эти значения по умолчанию на выключенный jit и размер буфера на 64 мегабайт:
Тип констант PHP_ZTS и PHP_DEBUG изменен с int на bool
PHP_ZTS и PHP_DEBUG - две глобальные константы PHP, которые предоставляют информацию о текущей среде выполнения PHP.
PHP_ZTS: Указывает, является ли текущая сборка PHP потокобезопасной.
PHP_DEBUG: Указывает, является ли текущая сборка PHP отладочной сборкой.
До PHP 8.4 эти две константы содержали целочисленные значения: 0 когда отключено и 1 когда включено. Начиная с PHP 8.4 и более поздних версий, они изменились на логические значения .
Минимальная требуемая версия OpenSSL увеличена до 1.1.1
Это изменение увеличивает минимальную поддерживаемую версию библиотеки OpenSSL для расширения PHP OpenSSL до 1.1.1. За исключением серии RHEL/CentOS 7 , операционная система, скорее всего, предоставляет OpenSSL версии 1.1.1 или более поздней, и, таким образом, это изменение не окажет никакого влияния. RHEL/CentOS 7 прекращает свое существование на момент выпуска PHP 8.4.
Устаревшие функции
Неявные типы, допускающих NULL
В PHP наблюдалось странное поведение, при котором типизированная переменная со значением null по умолчанию автоматически становилась nullable. PHP 8.4 теперь не поддерживает неявно обнуляемые типы. Все объявления типов, имеющие значение по умолчанию null, но без объявления null в объявлении типа, выдают уведомление об устаревании:
Рекомендуется привести к явному виду:
Curl: CURLOPT_BINARYTRANSFER
Константа CURLOPT_BINARYTRANSFER, предоставляемая расширением Curl, устарела в PHP 8.4. Эта константа не имела никакого эффекта, начиная с PHP 5.1.2.
Константа E_STRICT устарела
Константа E_STRICT устарела в PHP 8.4. Использование константы в любом месте кода PHP теперь выдает уведомление об устаревании:
Вызов session_set_save_handler() с более чем 2 аргументами устарел RFC
Удалены функции и возможности
Pspell было перенесено из PHP Core в PECL
Расширение Pspell предоставляет из себя PHP функции проверки орфографии с помощью Pspell или Aspell. Зависимости этого расширения не получали никаких обновлений за последние несколько лет, в результате чего было принято решение расширение Pspell перенести из ядра PHP в расширение PECL в PHP 8.4.
IMAP было перенесено из PHP Core в PECL
Расширение IMAP в PHP обеспечивает функциональность для работы с почтовыми ящиками по протоколу IMAP. Базовая библиотека C, от которой зависит расширение, не получала никаких обновлений с 2018 года. Расширение IMAP также создает еще несколько проблем:
Отсутствие потокобезопасности. Сборки PHP-ZTS не могут собрать это расширение.
Отсутствие поддержки аутентификации XAUTH .
Ошибки в работе POP.
В PHP 8.4 расширение IMAP больше не является частью PHP Core и перешло в PECL, но рекомендуется перейти на альтернативные библиотеки, например Webklex/php-imap.
OCI8 и PDO-OCI были перенесены из PHP Core в PECL
Расширения oci8 и pdo_oci8 предоставляют функциональные возможности для использования баз данных Oracle в PHP. Эти расширения основаны на собственных библиотеках коммерческого поставщика Oracle. Эти расширения прошли длительный период накопления неисправленных ошибок и требуют значительных усилий для миграции их resource объектов в объекты классов. Учитывая зависимость этих расширений от сторонних проприетарных библиотек и необходимость усилий по их обслуживанию, расширения больше не являются частью ядра PHP и перешли на PECL как oci8 и pdo_oci.
Другое
Так же можно посмотреть черновик, связанный с функциями, которые должны быть объявлены устаревшими в PHP 8.4 и удалены в PHP 9.0:
DOMAttr::schemaTypeInfo и DOMElement::schemaTypeInfo
DOMImplementation::getFeature($feature, $version)
Constant DOM_PHP_ERR
mysqli_ping() и mysqli::ping()
Минимальная требуемая версия libcurl увеличена до 7.61.0
База данных символов Unicode в расширении mbstring обновлена до версии 16
Недопустимые режимы округления функции round() вызывают исключения ValueError
Влад02.05.2025
PHP превращается в какую то Java, пора уходить на Node.js