PHP 7.1: Головні нововведення
У PHP 7.1 типи перестають бути рідкістю: ?T дозволяє явно сказати «або клас, або null», void позначає функції без корисного результату, iterable описує все, що можна обійти foreach, а константи класу нарешті мають public/protected/private. З’являються multi-catch, зручніший list() із ключами та Closure::fromCallable().
Паралельно рушій менш терпимий до випадкових викликів: якщо в користувацькій функції не вистачає обов’язкових аргументів, отримаєте ArgumentCountError, а не лише warning. Окремо перевірте рядки з [], session.ini і тести, де два «щойно створені» DateTime порівнювали на рівність.
Зміст
- Nullable
?T voiditerable- Видимість констант
list()і ключі- Multi-catch
- Інші додатки
- Рецепти
- Зворотна несумісність
- Deprecated
- Інші зміни
Nullable ?T
function findUser(?int $id): ?User {
return $id === null ? null : User::load($id);
}
Для не-void потрібен return зі значенням або null; голий return; не підходить.
void
Дозволено return; без виразу; return $x; заборонено.
iterable
Приймає масив або Traversable.
Видимість констант
Як у властивостей: public, protected, private.
list() і ключі
Можна діставати елементи за ключами; є коротка форма [$a, $b] = … — менше шуму в обробниках конфігів.
Multi-catch
} catch (FooException | BarException $e) {
Інші додатки
Closure::fromCallable(), pcntl_async_signals(), коди помилок cURL multi/share — повний перелік у migration71 new-features.
Рецепти
function save(User $user, bool $flush = false): void { /* … */ }
function label(?string $s): string {
return $s ?? 'default';
}
Зворотна несумісність
Арність
- User-defined з замалою кількістю аргументів →
ArgumentCountError.
Session
- Прибрано
session.entropy_*,session.hash_*.
Масиви й сортування
- Інший порядок елементів при автовивіфікації за посиланням порівняно з 7.0.
- Рівні елементи після сортування можуть іти в іншому порядку — не покладайтесь на стабільність «нічиїх».
Рядки
- Заборонено додавати
[]до рядка як до масиву; зміщення по рядку — байтові правила з мануалу.
Час і серіалізація
allowed_classesуunserializeлише bool/array.DateTime«зараз» містить мікросекунди.
JSON, mbstring, TLS
JSON_UNESCAPED_UNICODEекранює U+2028/U+2029.mb_ereg*: без збігу третій аргумент — порожній масив.- Немає sslv2 stream.
Замикання
useне може повторювати імена суперглобалів,$this, параметрів.
Розширення
Довгий список fatal → Error — migration71 incompatible.
Deprecated
mcrypt (у 7.2 вилучають з ядра); модифікатор e у mb_ereg_replace.
Інші зміни
Попередження для арифметики з кривими рядками; переповнення вісімкових escape.
Підсумок
7.1 — це типи, якими можна користуватися щодня: ?T/void/iterable зменшують двозначності, але ArgumentCountError і рядки викривлять старий код. Виправте це перед хвилею count() у 7.2.