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 версия уже доступна для загрузки и тестирования, но использовать ее в продакшене конечно пока не стоит.