PHP 7.1: Основни нововъведения
PHP 7.1 прави типизирания PHP ежедневно полезен: nullable типове (?T), връщане void, псевдотипът iterable, видимост на константите на клас, list() с ключове, multi-catch и Closure::fromCallable(). Двигателят стяга ръбовете — най-известното е ArgumentCountError, когато потребителски функции се викат с твърде малко аргументи; също се променя дреболийно поведение около низове, DateTime, опциите на unserialize() и стабилността при сортиране. Планирайте миграция около: арност, премахнати session INI и код, който третира низове като масиви с [].
Съдържание
- Nullable типове (
?T) - Връщан тип
void - Тип
iterable - Видимост на константи на клас
list()с ключове и кратко деструктуриране- Multi-catch
- Забележими допълнения
- Практически рецепти
- Обратна несъвместимост
- Deprecated
- Други промени
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.