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

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 → Errormigration71 incompatible.

Deprecated

mcrypt (у 7.2 вилучають з ядра); модифікатор e у mb_ereg_replace.

Інші зміни

Попередження для арифметики з кривими рядками; переповнення вісімкових escape.


Підсумок

7.1 — це типи, якими можна користуватися щодня: ?T/void/iterable зменшують двозначності, але ArgumentCountError і рядки викривлять старий код. Виправте це перед хвилею count() у 7.2.