Новинки в PHP 7: заключение

Дополнения и исправления.
2 минуты6037

Здравствуйте!

Это вторая и заключительная часть перевода информации о новинках 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».

phpphp7
Нашли ошибку в тексте? Напишите нам.
Спасибо,
что читаете наш блог!