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

Можно явно потребовать «любой объект» в параметре или как возвращаемое значение — удобно для коллекций зависимостей и полиморфных 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, которые снимают часть рутины вручную.