Статья также доступна на украинском (перейти к просмотру).
Содержание:
В двадцатых числах ноября 2024 года свет увидел новый релиз PHP 8.4.1, продолжающий давнюю традицию периодического обновления популярного препроцессора гипертекста по всем направлениям. Очень многие внесенные изменения касались ядра системы, в частности, изменился механизм обработки тела multipart-запросов, стала возможной работа с виртуальными значениями свойств объектов, был расширен и усовершенствован механизм маркировки устаревших элементов и многое другое. Изменения также коснулись многих модулей и драйверов, в частности, это появление нового DOM API для эффективного разбора HTML 5 документов, реализовано хеширование паролей на базе алгоритма PASSWORD_ARGON2, оптимизирован механизм управления работой JIT-компилятору и т.д. Ниже будут рассмотрены более подробно главные нововведения и поправки, появившиеся в новой версии интерпретатора.
Ядро
Новый функционал
Появилась новая функция request_parse_body(). Ее главное предназначение – разбиение по блокам тела multipart-запросов, метод которых отличный от метода POST. Разбиение будет производиться в соответствии с типом данных, определенным в заголовке Content-Type.
Появление глобальных констант:
PHP_OUTPUT_HANDLER_PROCESSED; PHP_SBINDIR.
Первая из констант "сообщает" о завершении обработки буфера. Вторая используется для установки значения параметра при конфигурировании ОС, в частности, Windows.
Проведено разграничение между областями видимости свойств объектов. Теперь пространство видимости свойств объектов не зависит от типа выполняемых над ними операций. Это, в частности, уменьшает потребность в использовании шаблонных операций get() функций при чтении свойств объектов
Изменился синтаксис конструкций для обращения к методам и свойствам объектов. Сразу после инициализации объектов при обращении к их свойствам и методам теперь можно опускать скобки вокруг оператора new.
Пример:
new PhpVer_php()->getVersion()
Добавлена поддержка «ленивых» или Lazy объектов. Использование «ленивых» объектов позволяет работать с ними, отсрочив при этом их инициализацию. Такая задержка может быть полезна, в частности, при запуске библиотек.
$initializer = static function (MyClass $proxy): MyClass {
return new MyClass(123);
};
$reflector = new ReflectionClass(MyClass::class);
$object = $reflector->newLazyProxy($initializer);
Введены аксессуары свойств (Property hooks) объектов. Аксессоры позволяют избавиться от спагетти-кода, работать со свойствами объектов на виртуальном уровне, не сохраняя постоянно их значения. Это, в частности, дает возможность выполнять как предварительную, так и последующую обработку значений не используя методы get и set.
class User
{
public function __construct(
private string $name,
private string $surname,
) {}
public string $fullName {
get {
return $this->name.' '.$this->surname;
}
}
}
Для свойств так же добавлена возможность использования в интерфейсах:
class BookViewModel
{
public private(set) Author $author;
}
Добавленоатрибут #[\Depricated]. Новый атрибут расширяет возможности по маркировке констант классов, пользовательских функций и ставших устаревшими методов. Его использование приводит к замене выдаваемого вида ошибки на E_USER_DEPRECATED, содержащая более подробное описание.
Улучшилось качество отладочной информации об объектах классов Closure и WeakReference.
Добавленна возможность асиметрической видимости. Это позволяет делать свойство видимым основываясь на его контексте.
Пример:
class BookViewModel{
public private(set) Author $author;
}
и конечно же можно использовать такую конструкцию в promoted свойствах
public function __construct(
private(set) Author $author;
) {}
Другие изменения и исправления
Изменен принцип формирования идентификаторов Замыканий. Теперь идентификатор замыкания формируется из названия функции высшего уровня и группы символов, которыми она определена. Кроме того, сопрограмма(Coroutine) не блокируются при запуске деструкторов. Это позволяет в случае необходимости осуществлять переключение корутинов.
Усовершенствован механизм управления Обработчик вывода. Налажена автоматическая очистка информации о состоянии Обработчика, которая фиксируется в параметре флаги функции ob_start(). Изменился параметр управления функцией переопределения хостов. Вместо параметра session.trans_sid_hosts будет использоваться url_rewriter.hosts.
Улучшилась поддержка ОС Windows. Расширение AVX(2) для MSVC-сборок теперь верно идентифицируется процессором. Управление сборками, созданными на основе AVX-512 теперь осуществляется с помощью опции --enable-native-intrinsics.
Изменился тип констант:
PHP_DEBUG; PHP_ZTS.
Константы отнесены к логическому типу данных.
Измененная область значений die() и exit().Теперь они могут принимать только значения из диапазона допустимых значений функции обратного вызова callable().
Стало невозможным опосредованное изменение значений свойств объектов с read разрешением. Если будет происходить операция по изменению значения свойства, то это вызовет роковую ошибку.
Модули / Драйверы
Новый функционал
DOM
Создано новый DOM API для обработки HTML 5 документов. Новый API обеспечивает более удобную работу с документами и исправляет ряд ошибок. Для создания новых документов используются следующие классы:
-
Dom\HTMLDocument;
-
Dom\XMLDocument.
Здесь идентификатор DOM определяет пространство имен для нового API.
Появился новый метод для интерфейса Node: compareDocumentPosition().
Метод сравнивает положение двух узлов и возвращает битовую маску, образованную из констант типа DOCUMENT_POSITION_*. В соответствии с этим было создано шесть новых констант:
CONTAINS; _FOLLOWING; _PRECEDING; _DISCONNECTED; _CONTAINED_BY; _IMPLEMENTATION_SPECIFIC.
Методы класса XPath registerPhpFunctions() та registerPhpFunctionNs() теперь поддерживают функцию обратного вызова callback().
cURL
Добавлена константа CURLOPT_PREREQFUNCTION. Принимает значение функции callback(), вызываемая сразу после установления соединения. В зависимости от состояния соединения значениями функции могут быть:
CURL_PREREQFUNC_OK; CURL_PREREQFUNC_ABORT.
Добавлена константа CURLOPT_DEBUGFUNCTION. Принимает значение функции callback(), вызываемая при существовании запроса. Она возвращает тип сообщения о результатах отладки программы и именно сообщение. Тип сообщения может принимать значение констант из пространства CURLINFO_*:
_DATA_IN; _DATA_OUT; _HEADER_IN; _HEADER_OUT; _SSL_DATA_IN; _SSL_DATA_OUT; _TEXT.
Добавлены новые константы:
CURL_HTTP_VERSION_3; CURL_HTTP_VERSION_3ONLY.
Константы используются как значение параметра CURLOPT_HTTP_VERSION для соединения по протоколу HTTP соответствующей версии. Доступны для использования, начиная с версии libcurl 7.66.
Функция curl_version() получила новое дополнительное значение – Feature_list. Указанная опция содержит массивCURL-функций. Возвращает значение true в случае поддержки функции или false, если нет.
OpenSSL
Реализовано хеширование паролей на основе алгоритма PASSWORD_ARGON2. Условия работы: наличие версии 3.2 модуля OpenSSL и сборка типа Non Thread Safe.
Добавлена поддержка ключей, определенных на основе эллиптических кривых Curve448 + Curve25519. Соответственно, для их поддержки к нескольким функциям модуля были добавлены дополнительные поля для хранения новых значений кода. Вот эти функции:
pkey_new(); pkey_get_details(); verify(); sign().
SOAP
Появилась поддержка спецификации Кларка для области имен В карте классов теперь можно использовать записи, которые преобразуют тип определенной области имен в определенный класс.'{http://shop.ua}sport' => 'SportClass'.
Для сохранения сессий теперь используется функционал общего модуля сессий.
XSL
Значение параметров теперь могут содержать как двойные, так и одинарные кавычки.
PDO
Появилась поддержка SQL-парсеров, работающих с определенными драйверами БД. Парсеры поддерживают литералы в кавычках и комментарии двух типов – невложенные и начинающиеся с символов «--».
Введены новые подклассы, отображающие функциональность определенных баз данных. Это сближает их с драйверами и, соответственно, улучшает возможности и качество интеграции с разными типами БД.
PCRE
До версии 10.44 обновили библиотеку pcre2lib, поставляемая вместе с препроцессором PHP.
-
ты Perl-совместимым конструкциям стала доступна поддержка проверок переменной длины;
-
Максимальная длина меток групп захвата увеличилась до 128 символов;
-
Появилась поддержка процессорной архитектуры LoongArch JIT-компилятором.
Добавлена поддержка модификатору PCRE2_EXTRA_CASELESS_RESTRICT для r и ?r режимов.
Reflection
Добавлены несколько методов и констант кLazy-объектов.
Для ReflectionClass:
SKIP_DESTRUCTOR; SKIP_INITIALIZATION_ON_SERIALIZE; newLazyProxy(); resetAsLazyProxy(); initializeLazyObject(); getLazyInitializer(); newLazyGhost(); resetAsLazyGhost(); isUninitializedLazyObject(); markLazyObjectAsInitialized().
Для ReflectionProperty:
-
setRawValueWithoutLazyInitialization();
-
skipLazyInitialization().
Класс ReflectionAttribute получил новое свойство. Свойство name пригодится при осуществлении процесса отладки программы.
Phar
Добавлена поддержка модуля отметок времени в ОС Unix для Zip--архивов. Модуль улучшает гибкость и некоторые возможности администрирования.
Стандартные модули
Добавлено новое перечислениеRoundingMode. Его преимущества по сравнению с константами группы PHP_ROUND:
-
Дополнительные 4 режима округления;
-
Улучшенное обнаружение.
PDO_MYSQL
Добавлен пользовательский парсер. Характеристики парсера:
-
Поддержка трех типов комментариев – «невложенных», начинающихся с символов «--», начинающихся с символа «#»;
-
Поддержка литералов с обоими типами кавычек и символами экранирования;
-
Поддержка литеральных идентификаторов с обратными апострофами или кавычками и удвоением как средство экранирования.
Другие изменения и исправления
Opcache. Изменился способ управления режимами работы JIT-компилятор. Теперь режим работы JIT-компилятор указывается в директиве opcache.jit с помощью значений tracing / disable. По-прежнему компилятор выключен по умолчанию.
OpenSSL. Устранены ошибки в работе функции openssl_csr_new(). Раньше параметр extra_attributes функции принимал значение только уникального DN-имени объекта. Сейчас в качестве значения устанавливается ключ типа CSR(Certificate Signing Request).
LibXML. Внесены изменения в алгоритм работы функции libxml_set_streams_context(). При получении функцией значение, не связанное с потоковой передачей, сразу выбрасывается ошибка (выключение) TypeError.
Типизация констант в классах. Для модулей PPDO, XMLReader, Date, Reflection, Sqlite, SPL, та Intl в собственных классах сейчас нужно объявлять тип констант.
DBA. Произошло изменение типов принимаемых/возвращаемых функциями. Теперь вместо ресурсных значений dba_connection принимаются/возвращаются только объекты типа Dba\Connection.
FREEhost.UA – первый хостинг в Украине, который начал предоставлять виртуальный хостинг с PHP 8.4. Заказывайте хосинг сейчас и начинайте тестировать свои приложения с новой версией PHP.
Подписывайтесь на наш телеграмм-канал https://t.me/freehostua, чтобы быть в курсе новых полезных материалов
Смотрите наш канал Youtube на https://www.youtube.com/freehostua.
Мы в чем ошиблись, или что-то пропустили?
Напишите об этом в комментариях, мы с удовольствием ответим и обсуждаем Ваши замечания и предложения.
Дата: 09.12.2024 Автор: Александр Ровник
|
|
Авторам статьи важно Ваше мнение. Будем рады его обсудить с Вами:
comments powered by Disqus