update page now
PHP 8.4.20 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.

Замикання та callable-вирази першого класу в константних виразах

Статичні замикання та callable-вирази першого класу тепер можна використовувати в константних виразах, таких як параметри атрибутів.

Постійні cURL-дескриптори

Дескриптори тепер можуть зберігатися між декількома 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)

Замикання та callable-вирази першого класу в константних виразах

Статичні замикання та callable-вирази першого класу тепер можна використовувати в константних виразах. Це стосується параметрів атрибутів, значень за замовчуванням для властивостей і параметрів, а також констант.

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-дескриптори

На відміну від 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() оголошено застарілою. Натомість використовуйте порожній рядок.
  • Ключові слова «array» і «callable» більше не можна використовувати як псевдоніми класів у функції class_alias().
  • Магічні методи __sleep() і __wakeup() оголошено нерекомендованими. Натомість використувуйте магічні методи __serialize() та __unserialize().
  • Приведення NAN до інших типів тепер викликає попередження.
  • Деструктурування значень, що не є масивами (крім null), за допомогою [] або list() тепер викликає попередження.
  • Приведення чисел з плаваючою крапкою (або рядків, що їх представляють) до цілого типу тепер викликає попередження, якщо їх неможливо представити як ціле число.
To Top