Основные изменения в версии PHP 8.5

16 Января (ред)

Pipe-оператор |>

В PHP 8.5 представлен новый pipe-оператор ( |> ), который упрощает работу с последовательными вызовами функций. Этот оператор передаёт результат выполнения одной функции в качестве аргумента следующей функции в цепочке.

Ранее для последовательной обработки данных использовались два подхода: либо вложенные вызовы функций (которые затрудняют чтение кода из-за обратного порядка выполнения), либо создание промежуточных переменных для хранения результатов каждого шага.

С новым оператором код записывается более наглядно:

$output = $input 
    |> trim(...)
    |> fn (string $string) => str_replace('_', '-', $string)
    |> fn (string $string) => str_replace(['.', '/'], '', $string)
    |> strtolower(...);

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

Clone как функция

В PHP при работе с объектами иногда нужно создать копию существующего объекта. Для этого используется конструкция clone.

Что изменилось в PHP 8.5: Теперь clone можно дополнительно использовать как обычную функцию, и при этом сразу изменять свойства копируемого объекта:

class User {
    public function __construct(
        readonly private string $name,
        readonly private int $age,
        public bool $isActive = true,
    )
    {
    }
    public function cloneWidthAge(string $age): static
    {
        return clone($this, ['age' => $age]);
    }
}

$user = new User('Test', 18);

$new = $user->cloneWidthAge(25);

// Также можно сразу указать публичное поле при клонировании.

$new = clone($user, ['isActive' => false]);

Функции array_first и array_last

array_first - возвращает первое значение массива. Если массив пустой, то будет возвращен null.

array_last - возвращает последнее значение массива. Если массив пустой, то будет возвращен null.

Стоит обратить внимание, что возвращаемый null также может быть валидным значением в массиве.

Почему эти функции добавлены при наличии функций current() и end()? Скорее всего, что новые функции не сбрасывают указатель массива, который может быть сдвинут, например, использованием совместно с функцией next().

INI-директива max_memory_limit

При установке значения INI-директивы max_memory_limit - оно определяет максимальное значение, которое разрешено установить в memory_limit. Теперь злоупотреблять значением memory_limit в ходе выполнения скрипта будет сложнее.

Атрибут NoDiscard

В PHP 8.5 предложено добавить атрибут с указанием "важности" возвращаемого функцией или методом значения. Его нужно использовать обязательно (или обойти исключение приведением к типу void).

Расширение URI

В PHP 8.5 добавлено новое расширение UriRfc3986Uri\URI - универсальный класс для работы с URL, соответствующий стандартам RFC 3986 и WHATWG URL.

Атрибуты констант

Теперь можно назначать атрибуты для констант. Получить их можно будет с помощью ReflectionClassConstant::getAttributes() или ReflectionConstant::getAttributes().

Улучшения замыкания

Замыкания и функции теперь можно использовать в константах и атрибутах. Это означает, что вы можете определять функции прямо в атрибутах и константах классов.

final class PostsController
{
    #[AccessControl(static function (
        Request $request,
        Post $post,
    ): bool {
        return $request->user === $post->getAuthor();
    })]
    public function update(
        Request $request,
        Post $post,
    ): Response {
        // ...
    }
}

или так

class Foo {
    public const UPPER = static function (string $v): string { return strtoupper($v); };
    public const LOWER = 'strtolower'(...);
}

echo (Foo::UPPER)('Test'); // TEST
echo (Foo::LOWER)('Test'); // test

Трассировка стека для фатальных ошибок

В PHP 8.5 сообщения о фатальных ошибках содержат полную трассировку стека.

Устаревание магических методов __sleep()/__wakeup()

Старые способы (до PHP 7.4) преобразования объекта в строку устаревают, вместо них рекомендуется использовать более новые __serialize() и __unserialize().

Асимметричная видимость для статических свойств

После добавления в PHP 8.4 ассиметричной видимости для свойств в PHP 8.5 также добавлена ассиметричная видимость для статических свойств. Например:

class User
{
    static public private(set) string $email = '';

    public static function updateEmail(string $newEmail): void
    {
        // Внутри класса - разрешено менять.
        self::$email = $newEmail;
    }
}

$user = new User();

echo $user::$email; // Работает

$user::$email = 'new@email.com'; // Ошибка!

Расширение OPCache всегда включено

В PHP 8.5 OPcache будет всегда загружаемым.

Final свойств в конструкторе

Свойства объявленные в конструкторе теперь можно финализировать.

class User {
    public function __construct(
         final string $name,
         final string $email
    ) {}
}

Атрибут Override можно применять к свойствам

Атрибут #[Override] означает, что данный метод обязательно переопределяет вышестоящий метод в наследовании, теперь это актуально и для свойств.

Устарели альтернативные приведения скалярных типов

Теперь типы boolean|double|integer|binary будут выдавать предупреждение.


Все изменения на новом официальном лендинге https://www.php.net/releases/8.5/ru.php

Для ответа вы можете авторизоваться


Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.