PHP 7.4 — последняя версия перед PHP 8, содержит множество дополнений и исправлений синтаксиса, был выпущен 28 ноября 2019 года.
Короткие замыкания
Короткие замыкания допускают менее подробный синтаксис анонимной функции. Вместо многословного:
array_map(function (User $user) {
return $user->id;
}, $users)
можно использовать более лаконичное выражение:
array_map(fn(User $user) => $user->id, $users)
Предварительная загрузка (Preloading)
Предварительная загрузка — удивительное дополнение к ядру PHP, которое может привести к значительному улучшению производительности.
Итак, если вы в своей работе используете какой-либо фреймворк, его файлы должны быть загружены и перекомпилированы при каждом запросе. Предварительная загрузка позволяет серверу загружать PHP-файлы в память при запуске и иметь их постоянно доступными для всех последующих запросов.
Предварительная загрузка управляется директивой opcache.preload в файле php.ini. Эта директива указывает PHP-скрипт, который будет скомпилирован и выполнен при запуске сервера. Данный файл может использоваться для предварительной загрузки дополнительных файлов или через функцию opcache_compile_file() (подробнее см. Документацию PHP).
Повышение производительности, конечно, связано с некоторым условием: если источник предварительно загруженных файлов изменяется, сервер должен быть перезапущен.
Типизированные свойства
Это очень долгожданное со времён PHP 7 изменение в направлении более строгой типизации языка. Теперь у нас есть все основные возможности для строгой типизации.Для типизации доступны все типы, за исключением void и callable.
Интерфейс внешней функции
Интерфейс внешней функции, FFI, позволяет вызывать код C из пользовательского пространства. Это означает, что расширения PHP могут быть написаны на чистом PHP.
Следует отметить, что это сложная тема. Вам все еще нужны знания C, чтобы правильно использовать эту функцию.
Оператор присваивания значения NULL
Появится возможность использовать синтаксис «если левый параметр не существует или равен null, присвоить ему значение правого параметра».
Т.е. вместо этого:
$data['date'] = $data['date'] ?? new DateTime();
Вы можете сделать это:
$data['date'] ??= new DateTime();
Оператор распаковки (…) в массивах
Теперь можно использовать оператор распаковки в массивах:
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
Это работает только с массивами с числовыми ключами, с ассоциативными массивами распаковка работать не будет, ошибка будет выдана при обнаружении строкового ключа. Оператор спреда должен иметь лучшую производительность, чем array_merge. Это объясняется не только тем, что оператор распаковки является языковой структурой, в то время как array_merge является функцией, но и оптимизация времени компиляции может быть выполнена для констант массива. Плюс array_merge поддерживает операции только над массивами, а оператор спреда поддерживает реализацию объектов Traversable.
Разделитель числовых литералов
Отсутствие визуальных разделителей в группах цифр увеличивало время чтения и отладки кода, и могло привести к непреднамеренным ошибкам. Теперь добавлена поддержка символа подчёркивания в числовых литералах для визуального разделения групп цифр.
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
0137_041; // octal