После года разработки опубликован релиз языка программирования PHP 8.5. Новая ветка включает серию новых возможностей, а также несколько изменений, нарушающих совместимость.
Ключевые изменения в PHP 8.5 (1, 2, 3):
- Добавлен оператор “|>” (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) ) ) ); - Предоставлена поддержка присвоения новых значений клонированным объектам во время их клонирования, через передачу в функцию clone() ассоциативного массива. public function withTitle(string $title): self { return clone($this, [ ‘title’ => $title, ]); }
- Добавлен атрибут “#[NoDiscard]”, который может применяться для пометки функций, возвращаемые значения от которых всегда должны использоваться. Если возвращаемое подобной функцией значение игнорируется интерпретатор выведет предупреждение. Для обхода проверки можно использовать вызов с приведением к типу void. #[NoDiscard(“you must use this return value.”)] function foo(): string { return ‘hi’; } foo(); // вывод предупреждения (void) foo(); // Ok $string = foo(); // Ok
- Разрешено использование замыканий (closures) и вызываемых объектов первого класса (first-class callables) в константных выражениях, в которых ранее допускалось указание неизменяемых значений, вычисляемых во время компиляции. Например, теперь можно указывать замыкания в атрибутах, значениях по умолчанию и константах.
Используемые подобным образом замыкания всегда должны помечаться ключевым словом “static” и не могут обращаться в внешним переменным при помощи выражения “use”. #[SkipDiscovery(static function (Container $container): bool { return ! $container->get(Application::class) instanceof ConsoleApplication; })] - При выводе фатальных ошибок к тексту сообщения теперь прикрепляется обратная трассировка (backtrace) вызовов.
- Добавлены функции array_first() и array_last(), выводящие первый и последний элементы массива. Например, вместо $first = $array[array_key_first($array)] ?? null;
теперь можно писать $first = array_first($array); - Добавлен модуль URI, прелоставляющий упрощённый API для разбора ссылок. Разбор осуществляется при помощи библиотек uriparser и lexbor. use UriRfc3986Uri; $uri = new Uri(‘https://opennet.me/64290’); $uri->getHost(); // opennet.me $uri->getScheme(); // https://
- Реализован атрибут “#[DelayedTargetValidation]”, при помощи которого можно перенести проверку атрибутов, таких как “#[Override]”, со стадии компиляции на стадию выполнения. #[DelayedTargetValidation] #[Override] public const NAME = ‘Child’;
- Добавлены функции get_error_handler() и get_exception_handler() для определения функций с обработчиками ошибок и исключений.
- В модуле Curl реализована функция curl_share_init_persistent(), позволяющая совместно использовать дескрипторы при обработке разных запросов.
- В модуле Exif добавлена поддержка изображений в форматах HEIF и HEIC.
- Объявлены устаревшими: нестандартный синтаксис приведения имён типов (например, “(integer)”, а не “(int)”); использование обратных кавычек (‘) для вызова команд вместо shell_exec(); повторные объявления констант; использование точки с запятой вместо двоеточия для завершения операторов case; указание null вместо пустой строки массивах или в функции array_key_exists().
Из ini-файла удалена поддержка настройки “disabled_classes”.
Release.
Ссылка here.