PHP 7.2: Главные нововведения
Релиз PHP 7.2 подталкивает кодовую базу к современным практикам без прыжка к PHP 8: появляется настоящий тип object, работает расширение типов параметров (в дочернем методе типы можно убрать, но нельзя сузить несовместимо), PDOStatement::debugDumpParams() умеет показывать фактический SQL для эмулируемых prepared-запросов, в LDAP добавлены расширенные операции (EXOP), а в sockets — обёртки socket_addrinfo_* вокруг getaddrinfo(). В поставку входит расширение Sodium (libsodium) как рекомендуемая основа для новой криптографии.
Одновременно mcrypt исключают из ядра (остаётся в PECL «для археологов»), а ряд старых приёмов переводят в предупреждения и deprecated. На ревью миграции обязательно вынесите: вызовы count() на null/скалярах, get_class(null), приведения массив ↔ объект с «числовыми» ключами и любые остатки mcrypt.
Оглавление
- Тип
object - Расширение типов параметров
- PDO:
debugDumpParams() - LDAP: расширенные операции
- Sockets:
socket_addrinfo_* - Sodium (libsodium)
- Заметные изменения расширений и stdlib
- Практические рецепты
- Обратно несовместимые изменения
- Deprecated
- Прочие изменения и сборка
Тип object
Можно явно потребовать «любой объект» в параметре или как возвращаемое значение — удобно для коллекций зависимостей и полиморфных API.
function acceptsAnyObject(object $x): void {}
Расширение типов параметров
Если в интерфейсе параметр типизирован, реализация вправе опустить hint (это всё ещё contravariance). Попытка сузить тип или подменить его несовместимым вариантом на абстрактной цепочке приведёт к фатальной ошибке несовместимости.
PDO: debugDumpParams()
При включённой эмуляции prepared-стейтментов метод может вывести итоговый SQL, уже с подставленными bound-значениями — существенно ускоряет поиск ошибок в динамически собранных запросах.
LDAP: расширенные операции
Функции ldap_exop(), ldap_exop_passwd(), ldap_exop_whoami(), ldap_parse_exop() и набор констант вроде LDAP_EXOP_START_TLS закрывают типичные EXOP без ручной сборки байтов.
Sockets: socket_addrinfo_*
socket_addrinfo_lookup(), …_connect(), …_bind(), …_explain() — единая точка для резолва имени и подготовки сокета под IPv4/IPv6 и прочие семейства.
Sodium (libsodium)
Расширение поставляется вместе с PHP 7.2+ и открывает AEAD, хеши, KDF libsodium. Новый код шифрования пишите здесь или в OpenSSL, а mcrypt оставьте в прошлом.
Заметные изменения расширений и stdlib
utf8_encode()/utf8_decode()переехали в ядро как обычные строковые функции — не нужно тянуть XML-расширение ради них.mail()иmb_send_mail()принимают заголовки массивом строк.- DBA получил драйвер LMDB.
- GD:
imageantialias()доступен и с системным libgd;imagegd()честнее сохраняет truecolor. - Вызов
session_module_name('user')теперь даёт E_RECOVERABLE_ERROR, а не тихо игнорируется.
Практические рецепты
Перед count() на неизвестных данных
if (is_array($x) || $x instanceof \Countable) {
$n = count($x);
}
Функция is_countable() появится в PHP 7.3 — на 7.2 проверка остаётся явной.
Безопасное имя класса
$cls = is_object($obj) ? get_class($obj) : self::class;
Обратно несовместимые изменения
Ядро и типы
number_format()больше не возвращает строку-0в пограничных float-случаях — тесты на точное совпадение строки могут упасть.- Приведения объект ↔ массив с целочисленными/строковыми числовыми ключами стали согласованнее для доступа вида
$obj->{0}и$arr['0']— детали и примеры в migration72 incompatible. get_class(null)вызывает предупреждение — передавайте объект или используйте другой способ узнать контекст.count()и алиасsizeof()на не-считаемых типах даютE_WARNING; код, гдеcount(null)«работал», начнёт шуметь.- Наследие
__autoload()дополнительно подталкивают кspl_autoload_register()через deprecations.
Расширения
- MCrypt удалён из ядра — только PECL; в продакшене лучше мигрировать.
Deprecated
Ключевые пункты (полный список — migration72 deprecated):
__autoload()→spl_autoload_register().- «Голые» идентификаторы-константы: уровень серьёзности поднят с notice до warning (в будущем станет
Error). create_function(),each(), строковыйassert(), одноаргументныйparse_str(), алиасread_exif_data(), устаревшийgmp_random(),png2wbmp/jpeg2wbmpи другие хвосты PHP 4/5.
Прочие изменения и сборка
- На Unix для
./configureнужен Autoconf ≥ 2.64. - Флаг
--with-pdo-ociбольше не требует явной версии Instant Client в строке. - Убран неиспользуемый
--enable-gd-native-ttf. - Mcrypt окончательно смещён в PECL — планируйте Sodium/OpenSSL.
Итог
PHP 7.2 — удобная точка, чтобы вычистить mcrypt, пройтись grep-ом по count( и get_class(, и подготовить почву для 7.3: там появятся JsonException, is_countable() и гибкий heredoc, которые снимают часть рутины вручную.