PHP 7.1: Обзор новых возможностей

На Хабре уже был перевод с обзором несколько месяцев назад, но недавно вышел первый релиз-кандидат PHP 7.1, а значит никаких существенных изменений больше не будет и можно сказать, какие точно изменения будут в релизе. Я решил немного оживить сухой “changelog” своим вольным переводом изменений, которые принесет нам новая минорная версия 7.х ветки.

php 7.1

Новая функциональность

Добавлен возвращаемый тип «void» (RFC)

Теперь функции и методы, которые не должны ничего возвращать, можно помечать возвращаемым типом void:

Возврат какого-то значения из метода/функции, который помечен как void, будет генерировать исключение уровня Fatal Error. Обратите внимание, что NULL значение не приравнивается к void(отсутствию значения), то есть возращать NULL нельзя.

Кстати, это не значит что $x = someNethod(); не вернет ничего. Как и прежде в $x будет значение NULL. Так же void нельзя использовать как тип к параметру.

Добавлен новый псевдо-тип: «iterable» (RFC)

Этот тип по сути объединяет примитивный тип array и интерфейс Traversable (а значит и его производные: IteratorGenerator, etc). Проблема возникла на почве того, что к примеру, foreach может работать с обоими типами, но функция с типом array не примет объект с интерфейсом Traversable и наоборот.

Так же в рамках этого RFC была добавлена новая функция is_iterable(), которая работает аналогично другим is_* функциям.

Появилась возможность разрешать null в типизированных и возвращаемых параметрах (Nullable RFC)

Обратите внимание, что использование «?» и значение null по умолчанию не одно и тоже что

Причем добавление «?» оставляет поведение обратно совместимым

Также важный момент по наследованию:

В наследнике можно делать «строже» возвращаемый тип (то есть запрещать nullable), а параметр наоборот расширять до nullable, НО не наоборот!

Добавлена возможность использовать отрицательное значение для смещения в строках (RFC)

Отрицательные значения так же стали разрешены в некоторых строковых функциях: strpos, stripos, substr_count, grapheme_strpos, grapheme_stripos, grapheme_extract, iconv_strpos, file_get_contents, mb_strimwidth, mb_ereg_search_setpos, mb_strpos, mb_stripos.

Везде это означает считать смещение с конца строки.

Разрешено использовать строковые ключи в конструкции list() (RFC)

Так же был добавлен короткий синтаксис для list (RFC).

Особенности:

  • нельзя использовать смешанный синтаксис (если указываем ключи — то указываем их везде, если нет, то используются обычные индексы 0, 1, 2… как обычно):
  • пустые элементы с ключами тоже же не разрешены:
  • если ключа в исходном массиве нет, то будет выброшено предупреждение Notice: Undefined index: name, а в переменной будет NULL
  • при использовании вложенной конструкции list способы можно комбинировать

     

Конвертация callable выражений в замыкание(RFC)

Вот наглядный пример применения:

Поддержка модификаторов видимости для констант класса (RFC)

Ловить исключения можно объединяя несколько типов исключений в один блок (RFC)

Выбросы ошибок уровня E_NOTICE and E_WARNING при арифметических операциях над строками содержащие не валидные числа (RFC)

Это довольно важное изменение, которое теоритически может сломать обратную совместимость приложения если используются свои error handlers для перехвата предупреждений.

Причем есть интересная особенность: пробел в начале строк “ 5” + “ 3” — не даст ошибок. А вот “5 ” + “3 ” — пробел в конце уже даст выдаст предупреждения.

Для обхода последствий неявного преобразования и выброса предупреждений можно явно указывать “cast” в нужный тип: (int)“5 ” + (int)“3 ” или подавлять все принудительно @(“5 ” + “3 ”).

Другие изменения и обратные несовместимости

  • В связи с новыми типами, добавлены новые зарезервированные слова voiditerable, и код который содержит классы, интерфейсы, трейты с такими именами будет давать ошибку в 7.1
  • Поменяли поведение в php экстеншенах, которые продолжали выкидывать Fatal Error вместо генерации Error исключения (как текущее ядро 7.0), плюс ошибки уровня E_ERROR или E_RECOVERABLE_ERROR тоже стали выбрасывать исключения там, где возможно (понятное дело, что при нехватки памяти по прежнему скрипт необратимо падает (RFC)).
  • Изменилось поведение при вызове функций / методов без передачи обязательных аргументов. Теперь вместо привычного Warning предупреждения, будет выброшено исключение ArgumentCountError (наследует тип Error RFC):
  • Следующие функции больше нельзя вызвать динамически через: $func(), call_user_func(), array_map() и тд:
    1. extract()
    2. compact()
    3. get_defined_vars()
    4. func_get_args()
    5. func_get_arg()
    6. func_num_args()
    7. parse_str() с одним аргументом
    8. mb_parse_str() с одним аргументом
    9. assert() больше нельзя использовать строку в качестве агрумента
  • Функции rand() и srand() теперь просто псевдонимы (alias) к функциям mt_rand() и mt_srand().
    Это в свою очередь затронет вывод таких функций:

    1. rand()
    2. shuffle()
    3. str_shuffle()
    4. array_rand()
  • Добавлена функция session_gc(). Теперь можно чистить старые сессии прямо из скриптов.
  • Добавлена функция session_create_id(), которая позволяет сгенерировать валидный автоматический id сесии без запуска новой сесии, который можно будет использовать в session_id() для старта сессии со сгенерированным ранее ID.
  • Ускорили генерацию ID сессии в 2+ раз, убрав хеширование и используя новую функцию из 7.0 php_random_bytes()
  • Убрали неконсистентное поведение над переменной $this
  • Расширение mcrypt помечено как устаревшее и все mcrypt_* функции будут выкидывать E_DEPRECATED.
  • В curl расширение добавлена поддержка для HTTP/2 Server Push, так же были добавлены новый функции curl_multi_errno(), curl_share_errno(), curl_share_strerror().
  • Опция ‘e’ для функций mb_ereg_replace() и mb_eregi_replace() обьявлена устаревшей.

На этом мы пожалуй и остановимся, хотя там еще полно мелких изменений в основном в расширениях. А нам для холивара вполне хватит и этого списка. )

Итог

Лично моё мнение про данный минорный релиз: все очень органично вписалось, именно этого и не хватало в большинстве своем в новом PHP 7.0 и данные изменения лишь подчеркивают и усиливают особенности 7.х ветки.
Рекомендую дождаться 7.1.1 и можно обновляться без страха, что-то сломать (если вы конечно уже перешли на 7.0).

Данная статья не претендует на полное описание ВСЕХ изменений и я мог пропустить что-то важное, рекомендую все равно ознакомиться с первоисточниками:

» https://wiki.php.net/rfc#php_71
» https://github.com/php/php-src/blob/php-7.1.0RC1/UPGRADING

Источник habrahabr.ru

Оставьте ответ

comment-avatar

*