PHP 8.5: Новые сообщения об ошибках
С выходом PHP 8.5 разработчики получили не только новые возможности, но и 265 новых сообщений об ошибках, которые стали точнее, строже и информативнее. Большинство изменений связано с более тщательной проверкой типов, значений аргументов и использованием новых синтаксических конструкций.
Ниже представлен разбор наиболее распространённых ошибок, которые разработчики встретят при переходе на PHP 8.5 или при работе со старым кодом.
Основные ошибки и предупреждения PHP 8.5
syntax error, unexpected token ">"
Технически эта ошибка не является новой в PHP 8.5, а скорее более распространённой в PHP 8.4 и более старых версиях. При переходе с PHP 8.5 на более старую версию, если в коде присутствуют pipe-операторы, PHP выдаёт следующую синтаксическую ошибку:
<?php
echo "Hello World" |> mb_strtolower(...);
?>Это просто означает, что код должен выполняться только на PHP 8.5 или его необходимо исправить, чтобы он работал на более старых версиях PHP.
Arrow functions on the right hand side of |> must be parenthesized
PHP 8.5 — это, прежде всего, новый pipe-оператор |>. Он позволяет связывать методы слева направо, вместо вложенного подхода, доступного ранее.
Существует несколько ограничений для этого оператора: он должен связывать замыкания только с одним параметром. Можно использовать все виды замыканий и вызываемых объектов PHP, а это, очень много:
<?php
$result = "Hello World"
|> 'foo'
|> mb_strtolower(...)
|> new $object->method(...)
|> function(string $x): string {return strtolower($x);}
|> new aClass() // с помощью магического метода __invoke
|> [AnotherClass::class, 'aMethod']
|> mb_strtoupper(...)(...) // множественное (...) бесполезно, но возможно
|> fn($x) => trim($x); // !!
?>Это всё, что можно было бы ожидать в коде PHP, за исключением последнего. Невозможно напрямую использовать стрелочную функцию. Они должны быть помещены в скобки, чтобы их проанализировал и понял PHP.
Это ошибка компиляции с явным сообщением и необходимостью использования нового оператора pipe. Она будет возникать при рефакторинге кода и использовании новых функций. Это будет частью начального этапа обучения и не должно вызывать удивления.
Using null as an array offset is deprecated, use an empty string instead
Одно из изменений в поведении PHP 8.5 касается данных: использование null в качестве индекса массива больше не поддерживается. До сих пор null тихо преобразовывался в пустую строку и использовался как есть. При этом весь процесс мог быть полностью незаметен для вызывающего кода.
<?php
$array = [1 => 'b'];
$array[null] = 3;
var_dump(isset($array[null]); // true
echo $array[null]; // 3
echo count($array); // 2
// но где создаётся $array['']?
var_dump(isset($array['']); // true
?>Такое предупреждение встретится очень часто: использование null в качестве индекса — распространённая и зачастую незаметная практика.
Самый простой вариант — явно преобразовать null в пустую строку с помощью оператора ??. Это устраняет устаревание и сохраняет прежнее поведение.
Возможно, также пора проверить, действительно ли null и '' пустая строка — это одно и то же, или же необходимо какое-то управление ошибками. Обе ситуации возможны, но требуют внимания.
Non-canonical cast (integer) is deprecated, use the (int) cast instead
Для каждой операции приведения типа существует двойник. Например, для преобразования данных в целое число можно использовать как (int), так и (integer). То же самое касается очевидных (bool) и (boolean), менее очевидных (float) и (double) и неожиданных (string) и (binary).
<?php
$integer = (integer) '123';
?>Хотя они существуют, но очень редко используются в коде и их довольно легко исправить.
Они также могут быть связаны со скалярным типом int, не поддерживающим тип integer: последний может быть даже определён как класс и использоваться как таковой.
The predefined locally scoped $http_response_header variable is deprecated, call http_get_last_response_headers() instead
http_response_header — зарезервированная переменная PHP, появляющаяся, когда PHP отправляет запрос на файл по сети, например с помощью file_get_contents() или fopen(). Затем эта переменная хранит полученные HTTP-заголовки, как и предполагает её название.
<?php
function foo() {
var_dump($http_response_header);
file_get_contents('https://www.php.net/');
var_dump($http_response_header);
}
foo();
?>Вышеуказанный код даёт следующий результат:
PHP Warning: Undefined variable $http_response_header
Warning: Undefined variable $http_response_header
NULL
array(13) {
[0]=>
string(15) "HTTP/1.1 200 OK"
[1]=>
string(17) "Server: myracloud"
[2]=>
string(35) "Date: Tue, 11 Nov 2025 09:27:13 GMT"
... ещё несколько заголовков после этогоНачиная с PHP 8.4, для доступа к этим заголовкам появилась встроенная функция http_get_last_response_headers(). Её следует использовать вместо любого доступа к $http_response_headerline и быть готовым к PHP 9.
syntax error, unexpected token "const"
Ещё одна ошибка синтаксиса, связанная со снижением версии, возникает при использовании атрибутов в глобальных константах.
Атрибут анализируется PHP 8.*, но он невалиден в глобальных константах в PHP 8.4 и более ранних версиях. Это приводит к данной ошибке синтаксиса. Её сложно понять, поскольку константы классов принимают атрибуты, а глобальные константы выглядят очень похоже.
<?php
#[ConstAttribute]
const A = 1;
?>Заключение
PHP 8.5 делает диагностику ошибок точнее и даёт разработчику больше инструментов для корректной и чистой разработки. Правильная подготовка проекта к обновлению позволит избежать проблем и упростит последующий переход на PHP 9.