Новая функциональность
Объявления скалярных типов
Объявления скалярных типов
введена в двух вариантах: принудительный (по умолчанию) и строгий.
Следующие типы могут использоваться для объявления параметров (в обоих вариантах):
строки (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
.
Их можно использовать тогда, когда нужен одноразовый класс и создавать полноценный
класс, а потом его объект не имеет смысла:
Подробную документацию и примеры использования читайте в разделе про
анонимные классы.
Синтаксис кодирования Unicode
Он принимает шестнадцатеричный код Unicode и записываем его в формате UTF-8 в
двойных кавычках или формате heredoc. Любой корректный код будет принят.
Ведущие нули по желанию.
Closure::call() является более производительным и
коротким способом временного связывания области действия объекта с замыканием и
его вызовом.
Эта функциональность обеспечивает более высокий уровень безопасности при десериализации
объектов с непроверенными данными. Это позволяет предотвратить возможную инъекцию
кода, позволяя разработчику использовать белый список классов для десериализации.
Новый класс IntlChar добавляет новую функциональность в
ICU. Класс определяет несколько статических методов и констант для манипулирования
символами Unicode.
Для использования это класса необходимо установить модуль
Intl.
Ожидания
Ожидания являются улучшенной,
обратно совместимой версией старой функции assert().
Они позволяют делать предположения с нулевой стоимостью в промышленном коде и
предоставляют возможность выбрасывать пользовательские исключения в случае
провала ожидания.
Вместе тем, что старое API поддерживается, assert() теперь является
языковой конструкцией, принимающей первым аргументом выражения, а не только
строки (string) для оценки или логические значения (bool) для проверки.
Подробное описание этого функционала, а также инструкции для его конфигурирования
для тестовых и промышленных сред, можно найти на странице руководства, посвящённой
функции assert().
Групповые объявления use
Классы, функции и константы импортируемые из одного и того же namespace
,
теперь можно группировать в одном операторе use
.
Выражение return в генераторах
Эта функциональность добавлена к генераторам, введённым в PHP 5.5.
Она позволяет использовать оператор return
в генераторах в качестве
окончательного возвращаемого значения (возврат по ссылке недопустим). Это значение можно
извлечь с помощью нового метода Generator::getReturn()
, который можно
использовать только после того, как генератор вернул все сгенерированные значение.
Возможность явно получать окончательное значение генератора является очень полезной,
так как позволяет клиентскому коду, использующему генератор, получать и обработать
самое последнее значение генератора, после которого точно ничего больше не будет.
Это сильно проще, чем вынуждать разработчика проверять, последнее ли значение
вернулось и как-то по особенному его обрабатывать.
Делегация генератора
Теперь генератор может автоматически делегировать другому генератору, объекту класса,
реализующий Traversable или массиву без необходимости писать в нем
дополнительную обработку полученных значений. Достигается это с помощью
конструкции yield from
.
Функция целочисленного деления 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()
.