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