Новинки в PHP 7: заключение
Здравствуйте!
Это вторая и заключительная часть перевода информации о новинках PHP 7. Первая часть: «Новинки в PHP 7»
Фильтрация unserialize()
Фильтрация повышает безопасность за счет запрета десериализации небезопасных объектов. Избежать воздействия инъекций кода позволяет создание «белого» списка классов, для которых разрешена десериализация.
// Преобразует все объекты в __PHP_Incomplete_Class
$data = unserialize($foo, ["allowed_classes" => false]);
// Преобразует все объекты в __PHP_Incomplete_Class кроме MyClass и MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]]);
// поведение по умолчанию (то же самое что и при исключение второго аргумента), разрешены все классы
$data = unserialize($foo, ["allowed_classes" => true]);
IntlChar
Новый класс IntlChar реализует дополнительные функции ICU (International Components for Unicode). Класс определяет статические методы и константы для работы с юникодом.
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
Результат:
10ffff
COMMERCIAL AT
bool(true)
Для использования класса необходимо установить расширение Int.
Ожидания (expectations)
Ожидания — языковая конструкция, обратно совместимая со старой функцией assert(). Вот как это работает: при срабатывании assert() исключение выбрасывается только в режиме разработки и не влияет на боевой код. При этом для совместимости сохранен старый API, но теперь первым параметром assert() принимает выражение, а не только строку или булеву переменную.
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Some error message'));
Результат:
Fatal error: Uncaught CustomError: Some error message
См. также: исключения.
Группировка импортов
Классы, функции и константы, импортируемые из одного и того же пространства имен, группируются в один импорт.
// Код версий младше PHP 7
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ код
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
См. также: пространства имен, импорты.
Конструкции возврата значений генератора
Теперь допускается использование языковой конструкции «return» в генераторе для возврата финального значения (возвращение значений с использованием ссылок не допускается). Финальное значение извлекается с помощью метода newGenerator::getReturn(). Генератор вернет значение после завершения возвращающих операций.
$gen = (function() {
yield 1;
yield 2;
return 3;
})();
foreach ($gen as $val) {
echo $val, PHP_EOL;
}
echo $gen->getReturn(), PHP_EOL;
Результат:
1
2
3
Явный возврат финального значения генератора позволяет обрабатывать значение непосредственно в коде, вызывающем генератор. Это гораздо проще, чем проверять, является ли каждое возвращенное значение финальным, чтобы обработать его отдельно.
Делегирование генератора
Генераторы теперь могут передавать другим генераторам обходимые (traversable) объекты или массивы с помощью yield автоматически, не требуя использования шаблонов в конечном генераторе.
function gen() {
yield 1;
yield 2;
yield from gen2();
}
function gen2() {
yield 3;
yield 4;
}
foreach (gen() as $val) {
echo $val, PHP_EOL;
}
Результат:
1
2
3
4
См. также: traversable, yield.
Целочисленное деление с помощью intdiv()
var_dump(intdiv(10, 3));
Результат:
int(3)
Параметры сессий
session_start принимает массив параметров, переопределяющих конфигурационные директивы сессии, указанные в php.ini.
Поддерживается изменение session.lazy_write (по умолчанию при изменении данных сессии только перезаписываются) и read_and_close (сессионные данные закрываются немедленно после считывания).
Пример кода, устанавливающего значение private для параметра session.cache_limiter и флага немедленного закрытия данных сессии после считывания:
session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);
См. также: конфигурация сессий.
preg_replace_callback_array()
Использование preg_replace_callback_array() делает код более прозрачным по сравнению с preg_replace_callback(). До 7-й версии PHP требовалось достаточно много непрозрачных ответвлений (branching) для определения вызова функции с помощью регулярного выражения. Теперь вызовы регистрируются для каждого регулярного выражения с помощью ассоциативного массива, где регулярное выражение — ключ, а соотвествующий вызов — значение.
CSPRNG
Две новые кроссплатформенные функции для создания криптографически безопасных строк и чисел: random_bytes() и random_int().
list() распаковывает объекты с использованием ArrayAccess
Раньше list() не всегда корректно работала с объектами с помощью интерфейса ArrayAccess. Теперь это исправлено.
Тем, кто хочет разрабатывать на PHP, рекомендуем профессию «Программист PHP».