Новая функциональность
Объявления скалярных типов
Скалярные типы объявляют в двух режимах:
нестрогом, в котором PHP работает по умолчанию, и строгом.
Теперь как в нестрогом, так и в строгом режимах разрешается задавать
следующие типы параметров:
строки (string), целые числа (int), числа с плавающей точкой
(float) и логические значения (bool). Перечисленные типы дополняют
другие типы, которые появились в PHP 5: имена классов, интерфейсов,
массивы (array) и callable.
Для установки строгого режима, в самом начале файла необходимо поместить одну
директиву declare
. Это означает, что строгость объявления скалярных типов
работает на уровне файла и
не затрагивает весь остальной код. Эта директива затрагивает не только объявления
параметров, но и возвращаемые значения функций (смотрите
объявления возвращаемого типа),
встроенные функции PHP и функции загруженных модулей.
Подробную документацию и примеры использования читайте в разделе
декларация типов.
Оператор объединения с null
Был добавлен оператор объединения с null (??
), являющийся
синтаксическим сахаром для достаточно распространённого действия, когда совместно
используются тернарный оператор и функция isset(). Он возвращает
первый операнд, если он задан и не равен null
, а в обратном случае возвращает второй
операнд.
Оператор spaceship (космический корабль)
Этот оператор предназначен для сравнения двух выражений. Он возвращает -1, 0 или 1
если $a, соответственно, меньше, равно или больше чем
$b. Сравнение производится в соответствии с
правилами сравнения типов PHP.
Определение констант массивов с помощью define()
Можно определить константу типа array с помощью функции
define(). В PHP 5.6 такие константы можно было задавать только с
помощью const
.
Анонимные классы
Была добавлена поддержка анонимных классов с помощью new class
.
Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный
класс, а потом его объект не имеет смысла:
Подробную документацию и примеры использования читайте в разделе про
анонимные классы.
Синтаксис экранирования кодовых точек Юникода
Синтаксис принимает кодовую точку Юникода в шестнадцатеричном формате,
которую записали в кодировке UTF-8 как строку в двойных кавычках или heredoc-синтаксисом,
и выводит эту кодовую точку в формате UTF-8. Синтаксис примет каждую допустимую кодовую точку.
Ведущие нули в шестнадцатеричной последовательности указывать необязательно.
Closure::call() — более производительный
и короткий способ временного связывания области действия объекта с замыканием
и его вызовом.
Эта функциональность обеспечивает более высокий уровень безопасности при десериализации
объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию
кода, позволяя разработчику использовать белый список классов для десериализации.
Новый класс IntlChar добавляет новую функциональность в
ICU. Класс определяет несколько статических методов и констант для манипулирования
символами Unicode.
Для работы с этим классом требуется установить модуль
Intl.
Ожидания
Ожидания являются улучшенной,
обратно совместимой версией старой функции assert().
Они позволяют делать предположения с нулевой стоимостью в промышленном коде и
предоставляют возможность выбрасывать пользовательские исключения в случае
провала ожидания.
Вместе тем, что старое API поддерживается, assert() теперь является
языковой конструкцией, принимающей первым аргументом выражения, а не только
строки (string) для оценки или логические значения (bool) для проверки.
Подробное описание этого функционала, а также инструкции для его конфигурирования
для тестовых и промышленных сред, можно найти на странице руководства, посвящённой
функции assert().
Групповые объявления use
Классы, функции и константы импортируемые из одного и того же namespace
,
теперь можно группировать в одном операторе use
.
Выражение return в генераторах
Эта функциональность добавлена к генераторам, введённым в PHP 5.5.
Она позволяет использовать оператор return
в генераторах в качестве
окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно
извлечь с помощью нового метода Generator::getReturn()
, который можно
использовать только после того, как генератор вернул все сгенерированные значение.
Явно получать конечное значение генератора полезно,
поскольку разрешает клиентскому коду, который запустил генератор, получать и обрабатывать
финальное значение генератора (возможно, из какой-то формы сопрограммных вычислений).
Это значительно проще, чем заставлять клиентский код проверять, последнее ли значение вернул генератор,
а затем, если это так, отдельно обрабатывать значение.
Делегация генератора
Теперь генераторы за счёт конструкции yield from
умеют автоматически делегировать
выдачу значений другому генератору, Traversable-объекту
или массиву без написания шаблонного кода во внешнем генераторе.
Функция целочисленного деления intdiv()
Новая функция intdiv() выполняет целочисленное деление
операндов и возвращает результат деления.
Опции сессий
Теперь функция session_start() принимает массив опций, которые переопределят
конфигурационные директивы сессии
файла в php.ini.
Опции также расширили включённой по умолчанию опцией
session.lazy_write, которая говорит PHP,
что файл сессии нужно перезаписывать, только если изменились данные сессии,
и опцией read_and_close
, которую можно задать только через
функцию session_start(), чтобы PHP закрывал сессию сразу
после прочтения данных сессии и не вносил в сессию каких-либо изменений.
Приведём пример. Для установки директиве
session.cache_limiter значения
private
и немедленному закрытию сессии после чтения данных сессии:
Новая функция preg_replace_callback_array() помогает писать более
чистый код, когда требуется вызвать функцию
preg_replace_callback(). До PHP 7 при обработке
отдельных регулярных выражений отдельными функциями приходилось для каждой такой
обработки писать отдельный вызов функции.
Теперь можно использовать одну функцию и передавать в неё ассоциативный массив,
в котором ключи — регулярные выражения, а значения — функции обратного вызова.
Функции CSPRNG
Добавили две новые кросс-платформенные функции для генерации криптографически
безопасных строк и целых чисел: random_bytes()
и random_int().
Функция list() теперь всегда распаковывает объекты,
которые реализуют интерфейс ArrayAccess
Раньше функция list() не гарантировала корректную обработку
объектов, которые реализуют интерфейс ArrayAccess.
Это исправили.
Другие изменения
-
Добавили возможность доступа к методам и свойствам класса при клонировании,
то есть
(clone $foo)->bar()
.