Новые возможности
Ядро PHP
Типизированные свойства
Свойства класса теперь поддерживают объявления типов.
Приведённый пример показывает, что свойству
$user->id получится
присвоить только значения с типом
int, тогда как свойству
$user->name —
только значения с типом
string.
Стрелочные функции
Стрелочные функции — сокращённая запись для определения функций
с неявной привязкой родительской области видимости по значению.
Ограниченная ковариация возвращаемого типа и контравариантность типа аргумента
Следующий код теперь будет работать:
Полная поддержка вариантности доступна только при автозагрузке классов.
Нельзя ссылаться на типы циклически внутри одного файла, поскольку при ссылке
на класс, который пока недоступен, возникает фатальная ошибка.
Присваивающий оператор объединения с null
Распаковка внутри массивов
Разделитель в числовых литералах
Между знаками числовых литералов теперь допускаются символы подчёркивания.
Слабые ссылки
Слабые ссылки разрешают программисту хранить ссылку на объект,
которая не препятствует уничтожению объекта сборщиком мусора, когда ссылок на объект не осталось.
Исключения в магическом методе __toString()
В магическом методе __toString() разрешили
выбрасывать исключения. Раньше это вызывало фатальную ошибку. Существующие
отлавливаемые фатальные ошибки при преобразовании объекта в строку преобразовали
в исключения класса Error.
Модуль cURL
В дополнение к станадртным названиям файлов класс CURLFile теперь поддерживает
потоковые обёртки, если модуль собрали с библиотекой libcurl >= 7.56.0.
Модуль FFI
FFI — новый модуль, который предлагает простой способ вызова
библиотечных функций, доступа к встроенным переменным
и способ создавать или обращаться к структурам данных, которые определили в библиотеках на языке Си.
Модуль GD
Добавили константу IMG_FILTER_SCATTER для применения рассеивающегося фильтра к изображениям.
Модуль Hash
Добавили поддержку алгоритма crc32c, который вычисляет «хеш» на основе полинома Кастаноли.
С этой реализацией алгоритма CRC32 работают системы хранения наподобие iSCSI, SCTP, Btrfs и ext4.
Многобайтовые строки
Добавили функцию mb_str_split(), которая выполняет
то же, что и функция str_split(), но работает
с кодовыми точками, а не с байтами.
Модуль PDO
Имя пользователя и пароль как часть DSN-строки разрешили указывать
для драйверов mysql, mssql, sybase, dblib, firebird и oci. Раньше это поддерживалось
только для драйвера pgsql. Конструктор будет приоритетнее,
если имя пользователя с паролем указали и в конструкторе, и в DSN-строке.
В SQL-запросах разрешили экранировать вопросительные знаки, чтобы
они не воспринимались как заполнители параметров.
Запись ?? отправит один знак вопроса в базу данных,
и разрешит, например при работе с СУБД PostgreSQL, указывать оператор ?,
чтобы проверить, содержит ли столбец JSON конкретный ключ.
Драйвер PDO_SQLite
Вызов PDOStatement::getAttribute(PDO::SQLITE_ATTR_READONLY_STATEMENT)
проверит, доступен ли подготовленный запрос только для чтения,
т. е. не изменяет ли запрос базу данных.
При установке PDO::setAttribute(PDO::SQLITE_ATTR_EXTENDED_RESULT_CODES, true)
методы PDO::errorInfo() и PDOStatement::errorInfo()
возвращают расширенные коды ошибок СУБД SQLite3.
SQLite3
Добавили метод SQLite3::lastExtendedErrorCode(),
который получает последний расширенный код ошибки.
Добавили метод SQLite3::enableExtendedResultCodes($enable = true),
который заставит метод SQLite3::lastErrorCode()
возвращать расширенные коды ошибок.
Стандартные функции языка
Пользовательская сериализация объектов
Добавили новый механизм сериализации пользовательских объектов
через два новых магических метода: __serialize
и __unserialize.
Новый механизм сериализации заменяет интерфейс
Serializable,
который в будущем объявят устаревшим.
Функции слияния массивов без аргументов
Функции array_merge() и array_merge_recursive()
стали поддерживать вызов без аргументов. При вызове без аргументов функции возвращают пустой массив.
Функции также полезно вызывать с распаковкой аргумента spread-оператором: array_merge(...$arrays).
Функция proc_open() теперь принимает массив вместо
строки для выполнения команды. При таком вызове процесс открывается
напрямую, без командной оболочки, а PHP экранирует
аргументы, если потребуется.
Функция proc_open() теперь поддерживает
дескрипторы redirect и null.
Алгоритмы Argon2i и argon2id без библиотеки libargon
Функция password_hash() теперь поддерживает варианты хеширования argon2i и argon2id
из модуля Sodium, если PHP собрали без библиотеки libargon.