Релиз PHP 8.5

После годового цикла разработки состоялся выход новой версии языка программирования 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-файлов