Новые возможности

Ядро PHP

Более гибкий синтаксис Heredoc и Nowdoc

После закрывающего идентификатора в doc-строках больше не нужно ставить точку с запятой или новую строку. Кроме того, закрывающий идентификатор может быть с отступом, и в этом случае он будет удален из всех строк в doc-строке.

Деструктурирование массива поддерживает присвоение по ссылкам

Деструктурирование массива теперь поддерживает присвоение по ссылкам с помощью синтаксиса [&$a, [$b, &$c]] = $d. То же самое поддерживается и для list().

Оператор instanceof принимает литералы

Оператор instanceof теперь поддерживает литералы в качестве первого операнда, и в этом случае результат будет всегда false.

Исключение CompileError вместо некоторых ошибок компиляции

Добавлено новое исключение CompileError, которое наследуется от ParseError. Небольшое количество ошибок компиляции теперь будет выбрасывать CompileError вместо создания фатальной ошибки. В настоящее время это влияет только на ошибки компиляции, которые могут быть созданы token_get_all() в режиме TOKEN_PARSE, но в будущем может быть преобразовано больше ошибок.

В вызовах разрешена завершающая запятая

Завершающие запятые в вызовах функций и методов теперь разрешены.

Поддержка Argon2id

С аргументом --with-password-argon2[=dir] скрипта configure теперь поддерживаются оба хеша, как Argon2i, так и Argon2id, в функциях password_hash(), password_verify(), password_get_info() и password_needs_rehash(). Пароли могут быть хешированы и проверены, используя константу PASSWORD_ARGON2ID. Поддержка обоих алгоритмов Argon2i и Argon2id в функциях семейства password_*() теперь требует, чтобы PHP был скомпилирован с библиотекой libargon2 версии ≥ 20161029.

Менеджер процессов FastCGI

Для настройки логирования FPM были добавлены новые опции:

log_limit
Эта глобальная опция может использоваться для установки лимита логирования для строки логирования, позволяющая записывать сообщения длиной более 1024 символов без переноса. Также исправляет различные проблемы с упаковкой (wrapping).
log_buffering
Этот глобальная опция позволяет вести экспериментальное логирование без дополнительной буферизации.
decorate_workers_output
Этот вариант пула позволяет отключить отметку вывода (output decoration) для обработчиков, когда catch_workers_output включена.

Функции BC Math

Функция bcscale() теперь также может использоваться как геттер для извлечения текущего используемого масштаба.

Облегчённый протокол доступа к каталогам (LDAP)

Была добавлена полная поддержка LDAP Controls к функциям запросов LDAP и ldap_parse_result():

Функции мультибайтовых строк

Полная поддержка case-mapping и case-folding

Добавлен поддержка полного процесса преобразования регистра символов (case-mapping) и сравнение на идентичность разных регистров (case-folding). В отличие от простого case-mapping, полный case-mapping может изменить длину строки. Пример:

<?php
mb_strtoupper
("Straße");
// Выведет STRAßE в PHP 7.2
// Выведет STRASSE в PHP 7.3
?>
Различные режимы преобразования и сравнения регистра символов доступны в функции mb_convert_case():
  • MB_CASE_LOWER (используется mb_strtolower())
  • MB_CASE_UPPER (используется mb_strtoupper())
  • MB_CASE_TITLE
  • MB_CASE_FOLD
  • MB_CASE_LOWER_SIMPLE
  • MB_CASE_UPPER_SIMPLE
  • MB_CASE_TITLE_SIMPLE
  • MB_CASE_FOLD_SIMPLE (используется нечувствительными к регистру операциями)
Выполняет только безусловный, независимый от языка, полный процесс преобразования.

Операции, нечувствительные к регистру используют case-folding

Строковые операции без учета регистра теперь используют case-folding вместо case-mapping регистра при сравнении. Это означает, что теперь больше символов будут считаться (без учета регистра) равными.

MB_CASE_TITLE выполняет преобразование title-case

Функция mb_convert_case() с MB_CASE_TITLE теперь выполняет преобразование title-case в зависимости от свойств Unicode, основанных на Cased и CaseIgnorable. В частности, это также улучшает обработку кавычек и апостофов.

Поддержка Unicode 11

Таблицы данных мультибайтовых строк были обновлены до Юникода версии 11.

Поддержка больших строк

Функции мультибайтовых строк теперь корректно поддерживают строки размером более 2 Гб.

Улучшение производительности

Производительность модуля мультибайтовых строк была значительно повсеместно улучшена. Самые большие улучшения в функциях преобразования регистра.

Поддержка именованных фрагментов

Функции mb_ereg_* теперь поддерживают именованные фрагменты. Соответствующие функции, такие как mb_ereg(), теперь будут возвращать именованные фрагменты как с их номером группы, так и с их именем, аналогично PCRE:

<?php
mb_ereg
('(?<word>\w+)''国'$matches);
// => [0 => "国", 1 => "国", "word" => "国"];
?>
Кроме того, функция mb_ereg_replace() теперь поддерживает обозначения \k<> и \k'' для ссылки на именованные фрагменты в заменяющей строке:
<?php
mb_ereg_replace
('\s*(?<word>\w+)\s*'"_\k<word>_\k'word'_"' foo ');
// => "_foo_foo_"
?>
\k<> и \k'' также могут использоваться для нумерованных ссылок, которые также работают с номерами групп больше 9.

Readline

В функции readline_info() добавлена поддержка параметров completion_append_character и completion_suppress_append. Эти опции доступны, только если PHP скомпилирован с библиотекой libreadline (а не libedit).