• База знаний
  • /
  • Блог
  • /
  • Wiki
  • /
  • ONLINE CHAT
+380 (44) 364 05 71

Статья также доступна на украинском (перейти к просмотру).

Содержание:

В двадцатых числах ноября 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
navigate
go
exit
Спасибо, что выбираете FREEhost.UA