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 - Разширяване на типовете на параметрите
- PDO: по-богат
debugDumpParams() - LDAP extended operations (EXOP)
- Сокети:
socket_addrinfo_* - Sodium (libsodium) в ядрото
- Забележими разширения и stdlib
- Практически рецепти
- Обратна несъвместимост
- Deprecated (оправете рано)
- Други промени и събиране
Тип 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.