Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения.
Дополнительную логику добавляют через хук 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, которая устарела прежде, обновили и пометили этим атрибутом, что улучшило выдаваемые сообщения об ошибках за счёт включения краткого пояснения.
Для разбора multipart-запросов по протоколу HTTP, которые определяет стандарт RFC1867 (multipart) и метод HTTP-запроса которых отличается от метода POST, добавили функцию request_parse_body().
new
без круглых скобокВыражениям, которыми создают новый объект с аргументами конструктора, теперь доступно разыменование, поэтому такие выражения разрешают по цепочке вызывать методы, получать доступ к свойствам объекта, и обращаться к другим членам объекта без заключения выражения в круглые скобки.
Получение отладочной информации об слабых ссылках, которые представляет класс WeakReference,
теперь также выведет объект, на который ссылается слабая ссылка, или null
, если ссылка больше
недействительна.
Вывод магического метода Closure::__debugInfo() теперь включает название функции или метода, который вернул замыкание Closure, а также путь к файлу и строку, на которой определили замыкание.
Выход из пространства имён теперь очищает видимые символы. Это разрешает использовать символ в блоке пространства имён, даже если предыдущий блок пространства имён объявил символ с тем же именем.
Функция 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\Node, который работает аналогично прежнему классу DOMNode. Новые классы совместимы с языком разметки HTML 5 и соответствуют спецификации WHATWG; новые классы решают давние ошибки в модуле DOM. Старые классы модуля DOM остаются доступны в целях сохранения обратной совместимости.
Добавили метод DOMNode::compareDocumentPosition() и связанные с ним константы:
DOMNode::DOCUMENT_POSITION_DISCONNECTED
DOMNode::DOCUMENT_POSITION_PRECEDING
DOMNode::DOCUMENT_POSITION_FOLLOWING
DOMNode::DOCUMENT_POSITION_CONTAINS
DOMNode::DOCUMENT_POSITION_CONTAINED_BY
DOMNode::DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC
Метод DOMXPath::registerPhpFunctions() теперь принимает callable-значения.
Кроме того, метод DOMXPath::registerPhpFunctionNs()
теперь умеет регистрировать callback-функции, которые будут использовать свой
синтаксис вызова функции, а не вызовы вроде php:function('name')
.
Режим округления NumberFormatter::ROUND_HALFEVEN
дополнили новым режимом NumberFormatter::ROUND_HALFODD
.
Добавили поддержку ключей на основе эллиптических кривых 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).
Библиотеку pcre2lib, которая поставляется в комплекте с PHP, обновили до версии 10.44. Поэтому добавили поддержку JIT-компилятором процессорной архитектуры LoongArch, в Perl-совместимых элементах между фигурными скобками разрешили пробелы и теперь поддерживаются ретроспективные проверки переменной длины.
В библиотеке pcre2lib версии 10.44 максимальную длину меток именованных групп захвата
изменили с 32
до 128
символов.
Добавили поддержку модификатора r
(PCRE2_EXTRA_CASELESS_RESTRICT)
и модификатора режима (?r)
.
При включении вместе с модификатором (i
), который включает регистронезависимый поиск,
выражение блокирует смешивание ASCII-символов и символов, которые не входят в кодировку ASCII.
Добавили подклассы, характерные для драйверов. Новые классы модуля PDO улучшают поддержку функциональности, характерной для конкретных баз данных. Новые классы создают или путём вызова метода PDO::connect(), или создают экземпляр конкретного подкласса конкретного драйвера.
Добавили поддержку SQL-парсеров, характерных для конкретных драйверов. Парсер по умолчанию поддерживает:
Добавили пользовательский парсер, который поддерживает:
Добавили пользовательский парсер, который поддерживает:
E'string'
?
последовательностью символов ??
Добавили пользовательский парсер, который поддерживает:
Добавили поддержку модуля меток времени Unix для Zip-архивов.
Добавили поддержку изменения пути .php_history
через переменную окружения PHP_HISTFILE.
Класс ReflectionAttribute теперь содержит свойство name, чтобы улучшить опыт отладки.
Методы ReflectionClassConstant::__toString() и ReflectionProperty::__toString() теперь возвращают комментарии, которые прикрепили к документу.
Добавили новые методы и константы ленивых объектов:
ReflectionClass::SKIP_INITIALIZATION_ON_SERIALIZE
ReflectionClass::SKIP_DESTRUCTOR
Добавили поддержку нотации Кларка для пространств имён в карте классов.
В карте классов теперь разрешается указывать записи в нотации Кларка,
чтобы тип с конкретным пространством имён разрешался в конкретным класс.
Например: '{http://example.com}foo' => 'FooClass'
.
Экземпляры интерфейса DateTimeInterface, которые
передали в xsd:datetime
или похожие элементы, теперь
сериализуются как таковые, а не как пустая строка.
Сохранение сессий теперь работает с общим модулем сессий.
Добавили новое перечисление RoundingMode с понятными названиями
и улучшенной по сравнению с константами семейства
PHP_ROUND_*
обнаруживаемостью.
Более того, добавили четыре новых режима округления,
которые доступны только через новое перечисление RoundingMode.
Разрешили параметры, которые содержат как одинарные, так и двойные кавычки.
В метод XSLTProcessor::registerPhpFunctions() разрешили передавать callable-значения не только в виде строк или массивов, но и в других форматах, которые поддерживает PHP.
Добавили свойства XSLTProcessor::$maxTemplateDepth и XSLTProcessor::$maxTemplateVars для управления глубиной рекурсии при оценке XSL-шаблона.
Добавили константу ZipArchive::ER_TRUNCATED_ZIP
,
которую прежде добавили в библиотеку libzip 1.11.