После годового цикла разработки состоялся выход новой версии языка программирования PHP 8.5. Релиз пополнился рядом нововведений и некоторыми изменениями, которые могут повлиять на обратную совместимость.
Основные нововведения в PHP 8.5:
Оператор pipe "|>"
Появился новый оператор "|>", который упрощает цепочки вызовов функций, устраняя необходимость в промежуточных переменных. Результат выполнения одной функции передается в следующую. Для функций с одним аргументом используется синтаксис "...", а для многопараметрических функций применяются замыкания.
Пример использования:
$output = $input
|> trim(...)
|> fn (string $string) => str_replace(' ', '-', $string)
|> fn (string $string) => str_replace(['.', '/', '…'], '', $string)
|> strtolower(...);
Эквивалент традиционного подхода
$temp = trim($input);
$temp = str_replace(' ', '-', $temp);
$temp = str_replace(['.', '/', '…'], '', $temp);
$output = strtolower($temp);
Или альтернативный вариант:
$output = strtolower(
str_replace(['.', '/', '…'], '',
str_replace(' ', '-',
trim($input)
)
)
);
Присвоение значений при клонировании
Теперь можно присваивать новые значения свойствам клонированного объекта непосредственно в операции клонирования через передачу ассоциативного массива.
Пример:
public function withTitle(string $title): self
{
return clone($this, [
'title' => $title,
]);
}
Атрибут #[NoDiscard]
Новый атрибут позволяет помечать функции, возвращаемые значения которых должны быть обязательно использованы. Игнорирование возвращаемого значения приводит к предупреждению.
Пример:
#[NoDiscard("you must use this return value.")]
function foo(): string {
return 'hi';
}
foo(); // вызовет предупреждение
(void) foo(); // корректен
$string = foo(); // корректен
Замыкания в константных выражениях
Теперь можно использовать замыкания и first-class callables в константных выражениях, включая атрибуты и значения по умолчанию. Такие замыкания должны быть статическими и не могут использовать внешние переменные.
Пример:
#[SkipDiscovery(static function (Container $container): bool {
return ! $container->get(Application::class) instanceof ConsoleApplication;
})]
Новые функции работы с массивами - array_first и array_last
Ранее в PHP 7.3 были добавлены функции array_key_first и array_key_last, для получения первого и последнего ключа в массиве. Теперь было добавлено и извлечение значений, без изменения состояния массива:
- array_first - Извлечь первое значение из заданного массива, будет возвращен null если массив пуст.
- array_last - Извлечь последнее значение из заданного массива, будет возвращен null если массив пуст.
Другие значимые изменения:
- К фатальным ошибкам теперь добавляется обратная трассировка вызовов
- Новый модуль URI для разбора ссылок:
use Uri\Rfc3986\Uri;
$uri = new Uri('https://opennet.me/64290');
$uri->getHost(); // opennet.me
$uri->getScheme(); // https://
- Атрибут
#[DelayedTargetValidation]для переноса проверки атрибутов на стадию выполнения:#[DelayedTargetValidation] #[Override] public const NAME = 'Child';
- Новые функции для получения обработчиков:
get_error_handler()иget_exception_handler() - В модуле Curl добавлена
curl_share_init_persistent()для совместного использования дескрипторов - Модуль Exif теперь поддерживает форматы HEIF и HEIC
То, что объявлено устаревшим в PHP 8.5:
- Нестандартный синтаксис приведения типов (например, "(integer)")
- Использование обратных кавычек для вызова команд вместо shell_exec()
- Повторные объявления констант
- Точка с запятой вместо двоеточия для завершения case-операторов
- Использование null вместо пустой строки в array_key_exists()
- Удалена настройка "disabled_classes" из ini-файлов