PHP 8.5.0 Released!
Выпущен 20 ноября 2025

Лучше, быстрее, надолго.

PHP 8.5 — большое обновление языка PHP. Оно содержит множество новых возможностей, таких как модуль URI, оператор Pipe, поддержка изменения свойств при клонировании и многое другое.

Основные функции PHP 8.5

Быстрее, лучше, доступнее для разработчиков.

Модуль URI

В PHP 8.5 добавлен модуль URI для анализа, нормализации и обработки URL-адресов в соответствии со стандартами RFC 3986 и WHATWG URL.

Оператор Pipe

Оператор |> позволяет связывать вызываемые объекты слева направо, передавая значения через несколько функций без промежуточных переменных.

Clone With

Клонируйте объекты и обновляйте свойства с помощью нового синтаксиса clone(), который упрощает использование шаблона «with-er» для классов readonly.

Атрибут #[\NoDiscard]

Атрибут #[\NoDiscard] выдаёт предупреждение, если возвращаемое значение не используется, что помогает предотвратить ошибки и повысить общую безопасность API.

Замыкания и вызовы первого класса в константных выражениях

Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях, таких как параметры атрибутов.

Постоянные дескрипторы cURL Share

Теперь дескрипторы могут сохраняться между несколькими запросами PHP, что позволяет избежать затрат на повторную инициализацию соединения с одними и теми же хостами.

Модуль URI

Встроенный модуль URI предоставляет API для безопасного анализа и изменения URI и URL в соответствии со стандартами RFC 3986 и WHATWG URL.

Работает на базе библиотек uriparser (RFC 3986) и Lexbor (WHATWG URL).

Узнайте больше об этой функции в блоге PHP Foundation.

PHP 8.4 и ранее
$components = parse_url('https://php.net/releases/8.4/en.php');

var_dump($components['host']);
// string(7) "php.net"
PHP 8.5 Новинка RFC
use Uri\Rfc3986\Uri;

$uri = new Uri('https://php.net/releases/8.5/en.php');

var_dump($uri->getHost());
// string(7) "php.net"

Оператор Pipe

Оператор Pipe позволяет связывать вызовы функций в цепочку без использования промежуточных переменных. Позволяет заменить множество «вложенных вызовов» цепочкой.

Узнайте больше об этой функции в блоге PHP Foundation.

PHP 8.4 и ранее
$title = ' PHP 8.5 Released ';

$slug = strtolower(
    str_replace('.', '',
        str_replace(' ', '-',
            trim($title)
        )
    )
);

var_dump($slug);
// string(15) "php-85-released"
PHP 8.5 Новинка RFC
$title = ' PHP 8.5 Released ';

$slug = $title
    |> trim(...)
    |> (fn($str) => str_replace(' ', '-', $str))
    |> (fn($str) => str_replace('.', '', $str))
    |> strtolower(...);

var_dump($slug);
// string(15) "php-85-released"

Clone With

Теперь можно обновлять свойства во время клонирования объектов, передавая ассоциативный массив в функцию clone(). Это позволит напрямую поддерживать паттерн «with-er» для классов readonly.

PHP 8.4 и ранее
readonly class Color
{
    public function __construct(
        public int $red,
        public int $green,
        public int $blue,
        public int $alpha = 255,
    ) {}

    public function withAlpha(int $alpha): self
    {
        $values = get_object_vars($this);
        $values['alpha'] = $alpha;

        return new self(...$values);
    }
}

$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);
PHP 8.5 Новинка RFC
readonly class Color
{
    public function __construct(
        public int $red,
        public int $green,
        public int $blue,
        public int $alpha = 255,
    ) {}

    public function withAlpha(int $alpha): self
    {
        return clone($this, [
            'alpha' => $alpha,
        ]);
    }
}

$blue = new Color(79, 91, 147);
$transparentBlue = $blue->withAlpha(128);

Атрибут #[\NoDiscard]

Добавив атрибут #[\NoDiscard] к функции, PHP будет проверять, используется ли возвращаемое значение, и выдавать предупреждение, если это не так. Позволяет повысить безопасность API, где возвращаемое значение важно, но про него можно легко забыть.

Связанное приведение типов (void) может использоваться для указания, что значение намеренно не используется.

PHP 8.4 и ранее
function getPhpVersion(): string
{
    return 'PHP 8.4';
}

getPhpVersion(); // No warning
PHP 8.5 Новинка RFC
#[\NoDiscard]
function getPhpVersion(): string
{
    return 'PHP 8.5';
}

getPhpVersion();
// Warning: The return value of function getPhpVersion() should
// either be used or intentionally ignored by casting it as (void)

Замыкания и вызовы первого класса в константных выражениях

Статические замыкания и вызываемые объекты первого класса теперь могут использоваться в константных выражениях. Сюда входят параметры атрибутов, значения по умолчанию свойств и параметров, а также константы.

PHP 8.4 и ранее
final class PostsController
{
    #[AccessControl(
        new Expression('request.user === post.getAuthor()'),
    )]
    public function update(
        Request $request,
        Post $post,
    ): Response {
        // ...
    }
}
PHP 8.5 Новинка RFC RFC
final class PostsController
{
    #[AccessControl(static function (
        Request $request,
        Post $post,
    ): bool {
        return $request->user === $post->getAuthor();
    })]
    public function update(
        Request $request,
        Post $post,
    ): Response {
        // ...
    }
}

Постоянные дескрипторы cURL Share

В отличие от curl_share_init(), дескрипторы, созданные с помощью curl_share_init_persistent(), не будут уничтожены в конце запроса PHP. Если найден постоянный дескриптор с тем же набором параметров, он будет использован повторно, что позволит избежать затрат на повторную инициализацию дескрипторов cURL при каждом запросе.

PHP 8.4 и ранее
$sh = curl_share_init();
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_DNS);
curl_share_setopt($sh, CURLSHOPT_SHARE, CURL_LOCK_DATA_CONNECT);

$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);

curl_exec($ch);
PHP 8.5 Новинка RFC RFC
$sh = curl_share_init_persistent([
    CURL_LOCK_DATA_DNS,
    CURL_LOCK_DATA_CONNECT,
]);

$ch = curl_init('https://php.net/');
curl_setopt($ch, CURLOPT_SHARE, $sh);

// This may now reuse the connection from an earlier SAPI request
curl_exec($ch);

Функции array_first() и array_last()

Функции array_first() и array_last() возвращают первое или последнее значение массива, соответственно. Если массив пустой, возвращается null (что упрощает работу с оператором ??).

PHP 8.4 и ранее
$lastEvent = $events === []
    ? null
    : $events[array_key_last($events)];
PHP 8.5 Новинка RFC
$lastEvent = array_last($events);

Дополнительные функции и улучшения

  • Фатальные ошибки (такие как превышение максимального времени выполнения) теперь содержат обратную трассировку.
  • Атрибуты теперь можно использовать с константами.
  • Атрибут #[\Override] теперь может использоваться со свойствами.
  • Атрибут #[\Deprecated] теперь может использоваться с трейтами и константами.
  • Статические свойства теперь поддерживают асимметричную видимость.
  • Свойства могут быть помечены окончательными (final) с помощью свойств в конструкторе.
  • Добавлен метод Closure::getCurrent() для упрощения рекурсии в анонимных функциях.
  • Функции setcookie() и setrawcookie() теперь поддерживают ключ "partitioned".
  • Добавлены функции get_error_handler() и get_exception_handler().
  • Добавлены методы Dom\Element::getElementsByClassName() и Dom\Element::insertAdjacentHTML().
  • Добавлена фукнция grapheme_levenshtein().
  • Добавлен атрибут #[\DelayedTargetValidation], который можно использовать для подавления ошибок компиляции атрибутов ядра и модулей, которые используются на недопустимых целях.

Устаревшая функциональность и изменения в обратной совместимости

  • Обратный апостроф (`) как псевдоним для shell_exec() больше не поддерживается.
  • Неканонические имена типов (boolean), (integer), (double) и (binary) больше не поддерживаются. Вместо них используйте соответственно (bool), (int), (float) и (string).
  • INI-настройка disable_classes была удалена, так как она приводила к нарушению различных допущений движка.
  • Завершение операторов case точкой с запятой вместо двоеточия больше не поддерживается.
  • Использование null в качестве смещения массива или при вызове array_key_exists() объявлено устаревшим. Вместо этого используйте пустую строку.
  • В class_alias() больше нельзя использовать массивы и замыкания в качестве псевдонимов классов.
  • Магические методы __sleep() и __wakeup() были мягко объявлены устаревшими. Вместо них следует использовать магические методы __serialize() и __unserialize().
  • Теперь при преобразовании NAN в другие типы выдаётся предупреждение.
  • Деструктуризация значений, не являющихся массивами (кроме null), с помощью [] или list() теперь выдаёт предупреждение.
  • Теперь выдаётся предупреждение при преобразовании чисел с плавающей точкой (или строк, похожих на числа с плавающей точкой) в целые числа (int), если они не могут быть представлены в виде целого числа.
To Top