Что нового в PHP 7.2

20 июля вышла первая beta-версия PHP 7.2. В целом, релиз 7.2 не предвещает больших изменений, по сравнению с версией 7.1, тем не менее в данном обновлении есть несколько интересных изменений. Рассмотрим, что же нового появилось в PHP 7.2.

Обновления

  • Добавлено новое криптографическое расширение Sodium. Был принят RFC: Make Libsodium a Core Extension, в котором предлагалось включить в ядро PHP библиотеку Libsodium, предоставляющую аутентифицированное шифрование, высокоскоростную эллиптическую криптографию и многое другое.
  • В функции json_encode и json_decode добавлены опции JSON_INVALID_UTF8_IGNORE и JSON_INVALID_UTF8_SUBSTITUTE для игнорирования или замены некорректных последовательностей байтов UTF-8.
  • Расширения теперь разрешено загружать в ini файлах по имени (extension=<name>).
  • Расширение mcrypt, объявленное устаревшим в PHP 7.1, было перемещено в PECL.
  • Минимальные поддерживаемые версии Windows повышены до Windows 7 / Server 2008 R2

Улучшение производительности

С каждым новым релизом PHP становится все быстрее и экономичнее в использовании памяти, что не может не радовать. Очередной релиз так же содержит ряд оптимизаций, и согласно результатам тестов, версия PHP 7.2 немного быстрее, чем 7.1. Список изменений новой версии содержит следующие оптимизации производительности:

  • В Opcache добавлена глобальная оптимизация на основе анализа потока данных с использованием SSA (Static single assignment form): Sparse Conditional Constant Propagation (SCCP), удаление мертвого кода (Dead Code Elimination — DCE) и удаление неиспользуемых локальных переменных.
  • Оптимизирована работа встроенной функции in_array() с помощью поиска хеша в перевернутом массиве.

Устаревшие функции

В новой версии PHP некоторые старые функции объявляются устаревшими, и начнут выбрасывать deprecated notice:

  • __autoload — данная магическая функция была заменена на spl_autoload_register в PHP 5.1, и теперь объявлена устаревшей
  • $php_errormsg — переменная создавалась в локальном скопе при возникновении нефатальной ошибки, если опция track_errors была включена в ini-файле (отключена по умолчанию), и в этом случае ошибка не передавалась в обработчик ошибок.
  • create_function() — функция по сути является тонкой оберткой над eval(), как результат является источником потенциальных угроз безопасности, очень медленная и использует много памяти в работе.
  • mbstring.func_overload — это ini-настройка, позволяющая переопределить часть строковых функций их мультибайтовыми аналогами. Эта функция запрещена в некоторых библиотеках (например Symfony) и может вызывать проблемы при определенных условиях.
  • (unset) cast — данное преобразование обращает результат в null. По сути выражение (unset)$x не несет никакого дополнительного смысла и может запутать, т.к. оно не эквивалентно функции unset($x).
  • parse_str() без второго аргумента — это пережиток времен register_globals. Без передачи второго аргумента, функция присваивает полученные значения локальным переменным, что потенциально может быть небезопасным.
  • gmp_random() — начиная с версии 5.6 появились функции gmp_random_bits() и gmp_random_range(), которые заменяют gmp_ramdom(), но имеют больший контроль над результатом.
  • each() — аналог foreach, но значительно более медленный
  • assert() со строковым аргументом — при передаче строкового значения в assert, над строкой выполняется eval, что является потенциальной угрозой безопасности приложения.
  • Аргумент $errcontext в обработчиках ошибок — ранее в обработчик ошибок, заданный с помощью set_error_handler(), можно было передать $errcontext, содержащий массив всех локальных переменных на момент возникновения ошибки.

В целом, релиз 7.2 является не таким крупным, как переход от PHP 5.7 к 7.0, но тем не менее содержит ряд полезных обновлений. Beta версия уже доступна для загрузки и тестирования, но использовать ее в продакшене конечно пока не стоит.

Добавить комментарий