PHP 8.4.1 Released!

Новая функциональность

Ядро PHP

Хуки для свойств объектов

Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения. Дополнительную логику добавляют через хук get, который срабатывает при чтении свойства, и хук set, который срабатывает при записи значения в свойство объекта. Хуки умеют делать свойства виртуальными — без реальных значений.

<?php

class Person
{
// «Виртуальное» свойство. Невозможно установить значение виртуального свойства явным образом
public string $fullName {
get => $this->firstName . ' ' . $this->lastName;
}

// Каждая операция записи значения свойства пройдёт через хук. В свойство в итоге запишется значение, которое вернётся из хука.
// Доступ к свойству для чтения значения проходит в стандартном режиме
public string $firstName {
set => mb_ucfirst(strtolower($value));
}

// Каждая операция записи значения свойства пройдёт через хук, который сам запишет реальное значение свойства.
// Доступ к свойству для чтения значения проходит в стандартном режиме
public string $lastName {
set {
if (
strlen($value) < 2) {
throw new
\InvalidArgumentException('Слишком короткая фамилия');
}

$this->lastName = $value;
}
}
}

$p = new Person();

$p->firstName = 'пётр';
print
$p->firstName; // Конструкция выведет "Пётр"

$p->lastName = 'Петров';
print
$p->fullName; // Конструкция выведет "Пётр Петров"

?>

Асимметричная видимость свойств объектов

Видимостью свойств объектов для операций записи значения — set теперь разрешили управлять отдельно от видимости свойств для операций чтения — get.

<?php

class Example
{
// Первый модификатор управляет видимостью свойства для чтения, второй — видимостью для записи.
// Видимость для чтения нельзя сужать сильнее видимости для записи
public protected(set) string $name;

public function
__construct(string $name)
{
$this->name = $name;
}
}

?>

Ленивые объекты

С PHP 8.4.0 разрешили создавать объекты, инициализация которых откладывается до обращения к объекту. За счёт ленивых объектов библиотеки и фреймворки получают доступ к отсрочке получения данных или зависимостей, которые требуются для инициализации.

<?php

class Example
{
public function
__construct(private int $data) {}

// ...
}

$initializer = static function (Example $ghost): void {
// Fetch data or dependencies
$data = ...;

// Initialize
$ghost->__construct($data);
};

$reflector = new ReflectionClass(Example::class);
$object = $reflector->newLazyGhost($initializer);

?>

Атрибут #[\Deprecated]

Новый атрибут Deprecated помечает функции, методы и константы классов устаревшими. Поведение функциональности, которую пометили устаревшей этим атрибутом, совпадает с поведением механизма устаревания функциональности, которую предоставляет сам PHP. Единственное отличие состоит в том, что вместо кода ошибки E_DEPRECATED PHP выдаст ошибку уровня E_USER_DEPRECATED.

Функциональность самого PHP, которая устарела прежде, обновили и пометили этим атрибутом, что улучшило выдаваемые сообщения об ошибках за счёт включения краткого пояснения.

Разбор HTTP-запросов, метод которых отличается от POST, при передаче многокомпонентного содержимого по стандарту RFC1867

Для разбора multipart-запросов по протоколу HTTP, которые определяет стандарт RFC1867 (multipart) и метод HTTP-запроса которых отличается от метода POST, добавили функцию request_parse_body().

Объединение в цепочку вызовов выражения new без круглых скобок

Выражениям, которыми создают новый объект с аргументами конструктора, теперь доступно разыменование, поэтому такие выражения разрешают по цепочке вызывать методы, получать доступ к свойствам объекта, и обращаться к другим членам объекта без заключения выражения в круглые скобки.

Улучшение отладочной информации об объектах класса WeakReference

Получение отладочной информации об слабых ссылках, которые представляет класс WeakReference, теперь также выведет объект, на который ссылается слабая ссылка, или null, если ссылка больше недействительна.

Улучшение отладочной информации об объектах класса Closure

Вывод магического метода Closure::__debugInfo() теперь включает название функции или метода, который вернул замыкание Closure, а также путь к файлу и строку, на которой определили замыкание.

Определение идентичных символов в разных блоках пространства имён

Выход из пространства имён теперь очищает видимые символы. Это разрешает использовать символ в блоке пространства имён, даже если предыдущий блок пространства имён объявил символ с тем же именем.

Модуль cURL

Функция curl_version() возвращает дополнительное значение feature_list — ассоциативный массив со списком известных функций cURL, и поддерживаются ли они: true, если да, или false, если нет.

Добавили константы CURL_HTTP_VERSION_3 и CURL_HTTP_VERSION_3ONLY (доступны с libcurl 7.66 и 7.88) как доступные флаги для опции CURLOPT_HTTP_VERSION.

Добавили константу CURLOPT_PREREQFUNCTION — опция модуля cURL, которая принимает значение с типом callable, которое вызовет после установки соединения, но до отправки запроса. К функции обратного вызова предъявляется требование: вернуть или значение CURL_PREREQFUNC_OK, чтобы разрешить, или значение CURL_PREREQFUNC_ABORT, чтобы прервать запрос.

Добавили опцию CURLOPT_SERVER_RESPONSE_TIMEOUT, которая заменила опцию с названием CURLOPT_FTP_RESPONSE_TIMEOUT. Обе константы содержат одно и то же значение.

Добавили константу CURLOPT_DEBUGFUNCTION — опция модуля cURL, которая принимает значение с типом callable. Callback-функция вызывается в течение жизни запроса, который обрабатывается объектом CurlHandle. Функция обратного вызова получает целое число, которое содержит тип отладочного сообщения, и строку, которая содержит отладочное сообщение. Тип отладочного сообщения получает значение константы из следующего списка:

  • CURLINFO_TEXT
  • CURLINFO_HEADER_IN
  • CURLINFO_HEADER_OUT
  • CURLINFO_DATA_IN
  • CURLINFO_DATA_OUT
  • CURLINFO_SSL_DATA_IN
  • CURLINFO_SSL_DATA_OUT
При установке отладочной опции нельзя устанавливать параметр CURLINFO_HEADER_OUT, потому что параметр использует ту же функциональность библиотеки libcurl.

Функция curl_getinfo() теперь возвращает дополнительный ключ posttransfer_time_us, который содержит количество микросекунд от начала передачи до отправки последнего байта. При перенаправлениях время каждого запроса суммируется. Это значение также возвращает функция curl_getinfo() при вызове с аргументом CURLINFO_POSTTRANSFER_TIME_T для параметра option. Для этого требуется библиотека libcurl 8.10.0 или новее.

Модуль DOM

В модуль добавили пространство имён Dom с новыми классами наподобие Dom\Node, который работает аналогично прежнему классу DOMNode. Новые классы совместимы с языком разметки HTML 5 и соответствуют спецификации WHATWG; новые классы решают давние ошибки в модуле DOM. Старые классы модуля DOM остаются доступны в целях сохранения обратной совместимости.

Добавили метод DOMNode::compareDocumentPosition() и связанные с ним константы:

Метод DOMXPath::registerPhpFunctions() теперь принимает callable-значения. Кроме того, метод DOMXPath::registerPhpFunctionNs() теперь умеет регистрировать callback-функции, которые будут использовать свой синтаксис вызова функции, а не вызовы вроде php:function('name').

Модуль Intl

Режим округления NumberFormatter::ROUND_HALFEVEN дополнили новым режимом NumberFormatter::ROUND_HALFODD.

Модуль OpenSSL

Добавили поддержку ключей на основе эллиптических кривых Curve25519 + Curve448. В частности, поля x25519, ed25519, x448 и ed448 поддерживаются в функциях openssl_pkey_new(), openssl_pkey_get_details(), openssl_sign() и openssl_verify(), которые расширили для поддержки этих ключей.

Реализовали хеширование паролей алгоритмом PASSWORD_ARGON2. Для этого требуется модуль OpenSSL 3.2 и NTS-сборка (англ. сокр.: Non-Thread Safe).

Модуль PCRE

Библиотеку pcre2lib, которая поставляется в комплекте с PHP, обновили до версии 10.44. Поэтому добавили поддержку JIT-компилятором процессорной архитектуры LoongArch, в Perl-совместимых элементах между фигурными скобками разрешили пробелы и теперь поддерживаются ретроспективные проверки переменной длины.

В библиотеке pcre2lib версии 10.44 максимальную длину меток именованных групп захвата изменили с 32 до 128 символов.

Добавили поддержку модификатора r (PCRE2_EXTRA_CASELESS_RESTRICT) и модификатора режима (?r). При включении вместе с модификатором (i), который включает регистронезависимый поиск, выражение блокирует смешивание ASCII-символов и символов, которые не входят в кодировку ASCII.

Модуль PDO

Добавили подклассы, характерные для драйверов. Новые классы модуля PDO улучшают поддержку функциональности, характерной для конкретных баз данных. Новые классы создают или путём вызова метода PDO::connect(), или создают экземпляр конкретного подкласса конкретного драйвера.

Добавили ​​поддержку SQL-парсеров, характерных для конкретных драйверов. Парсер по умолчанию поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
  • комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C

Драйвер PDO_MYSQL

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением и обратным слешем в качестве механизма экранирования
  • литеральные идентификаторы с обратными машинописными апострофами, или обратными кавычками, с удвоением в качестве механизма экранирования
  • комментарии, которые начинаются с двух дефисов, за которыми следует как минимум один пробел, невложенные комментарии в стиле языка C и комментарии, которые начинаются с символа решётки

Драйвер PDO_PGSQL

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных и двойных кавычках с удвоением в качестве механизма экранирования
  • «экранирование» строковых литералов в стиле языка C: E'string'
  • строковые литералы между знаками долларов
  • Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C
  • экранирование оператора ? последовательностью символов ??

Драйвер PDO_SQLITE

Добавили пользовательский парсер, который поддерживает:

  • литералы в одинарных, двойных и обратных кавычках с удвоением в качестве механизма экранирования
  • идентификаторы в квадратных скобках
  • Комментарии, которые начинаются с двух дефисов, и невложенные комментарии в стиле языка C

Модуль Phar

Добавили поддержку модуля меток времени Unix для Zip-архивов.

Модуль Readline

Добавили поддержку изменения пути .php_history через переменную окружения PHP_HISTFILE.

Модуль Reflection

Класс ReflectionAttribute теперь содержит свойство name, чтобы улучшить опыт отладки.

Методы ReflectionClassConstant::__toString() и ReflectionProperty::__toString() теперь возвращают комментарии, которые прикрепили к документу.

Добавили новые методы и константы ленивых объектов:

Модуль SOAP

Добавили поддержку нотации Кларка для пространств имён в карте классов. В карте классов теперь разрешается указывать записи в нотации Кларка, чтобы тип с конкретным пространством имён разрешался в конкретным класс. Например: '{http://example.com}foo' => 'FooClass'.

Экземпляры интерфейса DateTimeInterface, которые передали в xsd:datetime или похожие элементы, теперь сериализуются как таковые, а не как пустая строка.

Сохранение сессий теперь работает с общим модулем сессий.

Стандартные модули

Добавили новое перечисление RoundingMode с понятными названиями и улучшенной по сравнению с константами семейства PHP_ROUND_* обнаруживаемостью. Более того, добавили четыре новых режима округления, которые доступны только через новое перечисление RoundingMode.

Модуль XSL

Разрешили параметры, которые содержат как одинарные, так и двойные кавычки.

В метод XSLTProcessor::registerPhpFunctions() разрешили передавать callable-значения не только в виде строк или массивов, но и в других форматах, которые поддерживает PHP.

Добавили свойства XSLTProcessor::$maxTemplateDepth и XSLTProcessor::$maxTemplateVars для управления глубиной рекурсии при оценке XSL-шаблона.

Модуль Zip

Добавили константу ZipArchive::ER_TRUNCATED_ZIP, которую прежде добавили в библиотеку libzip 1.11.

Добавить

Примечания пользователей

Пользователи ещё не добавляли примечания для страницы
To Top