PHP 7.2: Основни нововъведения

PHP 7.2 подобрява ежедневната инженерна работа: реален тип object, разширяване на типовете на параметрите при override (без нарушаване на LSP), по-подробен PDO debugging за емулирани prepares, LDAP extended operations, модерен addrinfo API за сокети и първокласни връзки към libsodium. Паралелно mcrypt излиза от ядрото (остава в PECL), а няколко легаси шаблона стават предупреждения или deprecated. Отделете време за хигиена на count(), get_class(null), привеждания между масиви и обекти с числови ключове и всеки код, още на mcrypt.

Съдържание


Тип object

Можете да декларирате object за параметри и връщан тип — всяка инстанция го удовлетворява. Това се съчетава с правилата за ковариантност/контравариантност, докато PHP се развива в рамките на 7.x.

function acceptsAnyObject(object $x): void {}

Разширяване на типовете на параметрите

Имплементациите могат да пропуснат type hint на параметър, който присъства при родителя/интерфейса (все още контравариантно безопасно). Свиване или смяна с несвързан тип по веригата abstract/interface — PHP отхвърля несъвместими override-и.

PDO: по-богат debugDumpParams()

PDOStatement::debugDumpParams() може да покаже пълния SQL, изпратен към сървъра при емулирани prepares, включително обвързаните стойности — полезно при дебъг на динамични заявки (само когато емулацията е включена).

LDAP extended operations (EXOP)

Нови помощници като ldap_exop(), ldap_exop_passwd(), ldap_exop_whoami(), ldap_parse_exop(), плюс константи като LDAP_EXOP_START_TLS — покриват чести EXOP потоци без ръчен LDAP „лепене“.

Сокети: socket_addrinfo_*

socket_addrinfo_lookup(), socket_addrinfo_connect(), socket_addrinfo_bind(), socket_addrinfo_explain() обвиват резолюция и свързване в стил getaddrinfo() — предпочитайте ги пред ръчен парсинг на AF_INET, когато ви трябват съвременни адресни семейства.

Sodium (libsodium) в ядрото

Разширението Sodium идва с PHP 7.2+ и излага AEAD, хеширане и KDF от libsodium. За нова криптография го третирайте като основен път вместо mcrypt (махнат от ядрото — вижте по-долу).

Забележими разширения и stdlib

  • utf8_encode() / utf8_decode() преминават към ядрени низови функции (вече не зависят от това да имате XML разширението).
  • mail() / mb_send_mail() приемат масив от заглавки освен низ.
  • DBA получава поддръжка на LMDB.
  • GD: imageantialias() със системен libgd; imagegd() пази truecolor по-верно.
  • session_module_name('user') вече вдига recoverable error вместо да мълчи.

Практически рецепти

Предпазване на count()

if (is_array($x) || $x instanceof \Countable) {
    $n = count($x);
}

(is_countable() идва в PHP 7.3 — на 7.2 ползвайте явната проверка.)

Безопасен get_class()

$cls = is_object($obj) ? get_class($obj) : self::class;

Обратна несъвместимост

Ядро и типове

  • number_format() вече не връща низ "-0" при странни float ръбове — UI/тестове, които са го очаквали, може да се променят.
  • Привеждане на масиви/обекти с числови ключове: достъпът $obj->{0} / $obj->{'0'} и огледалното (array) поведение е съгласувано за целочисленоподобни ключове — вижте migration72 incompatible.
  • get_class(null) вече предупреждава; пропуснете аргумента или подайте обект.
  • count()sizeof()) върху не-countable типове вдига E_WARNING — код, разчитащ на count(null) === 0, шумно се чупи.
  • Паралелно с deprecations около наследения __autoload — вижте секцията по-долу.

Разширения

  • MCrypt е премахнат от ядрото — инсталирайте от PECL, ако наистина трябва, но мигрирайте към OpenSSL/Sodium.

Deprecated (оправете рано)

Сигнални точки (пълен списък: migration72 deprecated):

  • __autoload() — ползвайте spl_autoload_register().
  • Некавичени bareword константи: преди notice, сега warning (в бъдеще може Error).
  • Наследени create_function(), each(), низов assert(), едноаргументен parse_str(), псевдоним read_exif_data(), gmp_random(), png2wbmp / jpeg2wbmp и др.

Други промени и събиране

  • Autoconf ≥ 2.64 под Unix; --with-pdo-oci вече не изисква версия на Instant Client във флага; премахнат е неизползваният --enable-gd-native-ttf.
  • MCrypt → PECL; за крипто работа приемете Sodium/OpenSSL.

Обобщение

PHP 7.2 е добър момент да изтриете пътищата с mcrypt, да прегледате count( върху стойности, които може да са null, и да оправите get_class(null). След това към 7.3+ за JsonException, is_countable() и по-удобен heredoc.