PHP 8.5 new error messages
With a host of new features, PHP 8.5 also brings another 265 new error messages. These new error messages appears as PHP pays more attention to received arguments: their type, their values are reviewed more carefully before being used.
And some error messages are prone to appear more often than others. Here is a small selection.
syntax error, unexpected token “>”
Technically, this error is not a new PHP 8.5 error, but rather a more popular PHP 8.4 and older error. When downgrading from PHP 8.5 to an older version, while there are some pipe operator in the code, PHP raises this syntax error:
<?php echo "Hello World" |> mb_strtolower(...); ?>
It simply signals that the code should only be run on PHP 8.5, or it needs to be refactored to run on older PHP versions.
Arrow functions on the right hand side of |> must be parenthesized
PHP 8.5 is all about the new pipe operator. It allows the chaining of methods from left to right, instead of the nested approach that was available so far.
There are a few constraints on this new operator : it must chain closures with one parameter only. Every kind of PHP closures and callable may be used, which is, at least, a lot:
<?php
$result = "Hello World"
|> 'foo'
|> mb_strtolower(...)
|> new $object->method(...)
|> function(string $x): string {return strtolower($x);}
|> new aClass() // with __invoke magic method
|> [AnotherClass::class, 'aMethod']
|> mb_strtoupper(...)(...) // multiple (...) is useless but possible
|> fn($x) => trim($x); // !!
?>
This is all what would be expected in PHP code, except the last one. It is not possible to use directly an arrow function. They must be put between parenthesis to be parsed and understood by PHP.
This is a compilation error, with an explicit message, and the needed usage of the new Pipe operator. This error will happen was the code is being refactored to take advantage of the new features. This will be part of the initial learning curve, and it shall not be a surprise.
Using null as an array offset is deprecated, use an empty string instead
One change in behavior in PHP 8.5 is data: it is the deprecation of using null as an array index. Until now, null is silently converted to empty string, and use as is. At time, the whole process may be completly invisible to the calling code.
<?php $array = [1 => 'b']; $array[null] = 3; var_dump(isset($array[null]); // true echo $array[null]; // 3 echo count($array); // 2 // but where is $array[''] created? var_dump(isset($array['']); // true ?>
This deprecation warning is bound to fill quite a lot of logs, as using null is common, and it is completely invisible.
The simplest option is to convert explicitly the nullvalue to empty string with the coalesce ?? operator. It makes the deprecation go away, and preserve the previous behavior.
It might also be time to check if null and ''empty string are, indeed, the same case, or if some error management is needed. Both situations are plausible, but require some attention.
Non-canonical cast (integer) is deprecated, use the (int) cast instead
For each cast operation, there is a twin version. For example, (int) and (integer) are both available to convert a piece of data into to an integer. This is also the case for the obvious (bool) and (boolean), for the less obvious (float) and (double), and the suprising (string) and (binary).
<?php $integer = (integer) '123'; ?>
While they exist, they are very rarely used in any code, and are quite easy to fix.
They may also be related to the int scalar type, which does not support the integer type: the latter may be even defined as a class, and used as such.
The predefined locally scoped $http_response_header variable is deprecated,
http_response_header is a PHP reserved variable, which appears when PHP submit a request over the network for a file, such as with file_get_contents() or fopen(). Then, that variable holds the received HTTP headers, just as the name suggest.
<?php
function foo() {
var_dump($http_response_header);
file_get_contents('https://www.php.net/');
var_dump($http_response_header);
}
foo();
?>
The code above results in this output:
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"
... more headers after that
Since PHP 8.4, the native function http_get_last_response_headers() is available to access these headers. It should be used to replace any access to the $http_response_headerline and be ready for PHP 9.
syntax error, unexpected token “const”
Another downgrading syntax error happens with attributes on global constant.
The attribute is parsed by PHP 8.*, yet it is not valid with a global constant with PHP 8.4 and older. This yields this syntax error. It may be hard to understand as class constants accept attributes, and global constants look very much alike.
<?php #[ConstAttribute] const A = 1; ?>
Happy PHP 8.5 migration
With more explicit error messages, PHP 8.5 brings a better view over code compilation and execution. Every PHP application benefit from compiling with this new version, even on older versions: it provides valuable insights on how to improve one’s code and make it future proof.

