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

PHP 7.1 прави типизирания PHP ежедневно полезен: nullable типове (?T), връщане void, псевдотипът iterable, видимост на константите на клас, list() с ключове, multi-catch и Closure::fromCallable(). Двигателят стяга ръбовете — най-известното е ArgumentCountError, когато потребителски функции се викат с твърде малко аргументи; също се променя дреболийно поведение около низове, DateTime, опциите на unserialize() и стабилността при сортиране. Планирайте миграция около: арност, премахнати session INI и код, който третира низове като масиви с [].

Съдържание


Nullable типове (?T)

Параметрите и връщаните типове могат да са ?Foo — приемат Foo или null. На всички пътища трябва да има return със стойност или null, освен ако типът не е void; гол return; без void не е позволен.

function findUser(?int $id): ?User {
    return $id === null ? null : User::load($id);
}

Връщан тип void

Функции без полезна връщана стойност могат да декларират void. Позволено е return; без израз; return $value; — не.

Тип iterable

iterable приема масив или обект, имплементиращ Traversable — един тип за „всичко, което може да се обходи с foreach“.

Видимост на константи на клас

Константите поддържат public / protected / private, както свойствата.

list() с ключове и кратко деструктуриране

list() може да адресира конкретни ключове (шаблони по мануала), а кратката форма [$a, $b] = $arr улеснява разопаковане на кортежи.

Multi-catch

try {
    // …
} catch (FooException | BarException $e) {
    // общ обработчик
}

Забележими допълнения

  • Closure::fromCallable() — обвиване на callable в истински Closure.
  • Взаимодействието void / ?Type е строго документирано от двигателя.
  • pcntl_async_signals(), curl_multi_errno() / curl_share_errno() — пълен списък: migration71 new-features.

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

Избягване на извиквания с малко аргументи

function save(User $user, bool $flush = false): void { /* … */ }
// Задължителните аргументи подавайте явно; опционалните наистина да са опционални.

Nullable и ранно връщане

function label(?string $s): string {
    return $s ?? 'default';
}

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

Арност при потребителски функции

  • Извикване на потребителска функция с твърде малко аргументи вече хвърля ArgumentCountError (преди: предупреждение). Вътрешните функции в голяма степен запазват старото поведение — прегледайте обвивки, разчитащи на предупреждения.

Премахнати session INI

  • session.entropy_file, session.entropy_length, session.hash_function, session.hash_bits_per_character са махнати — модерните session ID вече не минават през този хеширащ pipeline.

Масиви, референции, сортиране

  • Елементи от автовивифициран масив чрез присвояване по референция могат да се появят в различен ред спрямо PHP 7.0 — проверете, ако сте разчитали на 7.0 ред.
  • При сортиране равните по сравнение елементи могат да се пренаредят — не разчитайте на стабилност при равенство.

Низове срещу масиви

  • Празно [] към низ и свързани трикове „низ като масив“ са отхвърлени; присвояване на числови отмествания в низ следва байтовата семантика (примери в мануала).

Сериализация и време

  • unserialize($data, $options): allowed_classes трябва да е bool или array — други типове дават false + warning.
  • DateTime / DateTimeImmutable от „сега“ включват микросекунди — наивното сравнение на две „току-що създадени“ инстанции често се проваля.

JSON, mbstring, TLS

  • С JSON_UNESCAPED_UNICODE се екранират U+2028 / U+2029.
  • При mb_ereg() / mb_eregi() третият аргумент става празен масив, ако няма съвпадение.
  • Премахнат е sslv2 stream в OpenSSL.

Лексикални затваряния

  • Променливите в use не могат да повтарят имена на суперглобали, $this или параметри.

Широк преход fatal → Error

Много разширения вече хвърлят Error вместо fatals — дълъг списък: migration71 incompatible (DOM, Intl, mysqli, Session handlers, SimpleXML, SPL, Zip и др.).

Deprecated

  • ext/mcrypt е deprecated (в PHP 7.2 излиза от ядрото — планирайте OpenSSL/Sodium).
  • Модификаторът e за mb_ereg_replace() / mb_eregi_replace() (eval-стил замяна).

Други промени

  • Невалидна аритметика с числови низове вече вдига предупреждения/notices, където преди е имало тихо привеждане.
  • Препълване на осмични escape в низове предупреждава.

Обобщение

Вижте PHP 7.1 като „типизиран PHP v1“: ?T/void/iterable правят API-тата по-безопасни, но ArgumentCountError и промените при низови отмествания изваждат на повърхността стари бъгове от ерата на PHP 5. Оправете арността и работата с низове, преди да стигнете до предупрежденията за count() в 7.2.