Операциям чтения и записи свойств объектов теперь разрешили добавлять логику поведения.
Дополнительную логику добавляют через хук 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.