Published
Dominik Chrástecký - Blog New in PHP 8.5: Small Features, Big Impact New in PHP 8.5: Small Features, Big Impact- 6 min read
New in PHP 8.5: Small Features, Big Impact

The smaller features in PHP 8.5 that may not make headlines but definitely deserve a mention.
Originally, I intended to write an article about every single change in PHP 8.5, but then I realized that some of them don’t really warrant a full post. That didn’t stop me from trying, though.
Anyway, I’m older and wiser now (it’s been whole three months, after all), so here’s a single article covering the rest of the new features — the ones that might not justify a deep dive but are still worth knowing about.
OPcache Is Now a Mandatory Part of PHP
What many developers might not realize is that OPcache has been optional for the past decade, even though you’d be hard-pressed to find a production (or even development) server running PHP without it. That’s changing in PHP 8.5 — OPcache is now officially part of PHP itself and will no longer be bundled as a separate extension.
Final Property Promotion
I’ve already covered this in a separate article, but to summarize: promoted properties (the ones defined in a constructor’s parameter list) can now be declared final.
Attributes on Constants
Non-class compile-time constants (those declared with const, not define()) can now have attributes. Alongside this comes a new Attribute::TARGET_CONSTANT target and a new ReflectionConstant::getAttributes() method. You can also now use the built-in #[Deprecated] attribute on constants.
Asymmetric Visibility for Static Properties
This brings static properties in line with instance properties in terms of visibility. The same asymmetric-visibility rules now apply to both.
Easier Access to Error and Exception Handlers
Until now, PHP only provided setter functions for error and exception handlers, which returned the previous handler. To retrieve the current handler, developers had to resort to a small hack like this:
$currentHandler = set_error_handler('must_be_a_valid_callable');
restore_error_handler();
In PHP 8.5, you can use the new get_error_handler() and get_exception_handler() functions instead. Both return exactly the same value that was originally passed to their respective setter, with a return type of ?callable.
New array_first() and array_last() Functions
No more $array[array_key_first($array)] or, worse, reset($array)! These two new functions complement array_key_first() and array_key_last() introduced in PHP 7.3. They both return null for empty arrays.
A Saner Directory Class
The Directory class (returned, for example, by the dir() function) is what’s known as a resource object — a class-like wrapper for what used to be old-style resource types.
These resource objects typically can’t be instantiated with new, serialized, or cloned, and generally don’t behave like regular classes. The Directory class was the odd one out — it allowed all of that for historical reasons, though doing so never resulted in a valid instance, and directories created that way couldn’t actually be used.
In PHP 8.5, Directory joins the rest of its siblings and becomes a proper resource object, behaving consistently with the others.
#[Override] Can Now Apply to Properties
Just as you could previously mark methods that override a parent’s implementation, you can now apply #[Override] to properties. As with methods, PHP will throw an error if the property doesn’t actually override anything.
#[Deprecated] Can Be Used on Traits
This allows you to deprecate an entire trait. Whenever a class uses a deprecated trait, PHP will emit a deprecation notice.
Deprecations
As usual, PHP 8.5 brings a few deprecations. Besides some more obscure ones (did you know you could use a semicolon instead of a colon in a case statement?), here are the ones more likely to affect real-world codebases:
- Backtick operator: The backtick operator is now deprecated. If you’re unfamiliar, it’s a shorthand for
shell_exec()— for example,echo `whoami`;is equivalent toecho shell_exec('whoami');. Some older codebases still use it, so keep an eye out for that. __sleep()and__wakeup(): Following the deprecation of theSerializableinterface, PHP is now deprecating these legacy serialization hooks as well. Going forward, use__serialize()and__unserialize()instead.setAccessible()in Reflection: These methods have done nothing since PHP 8.1 but remained for backward compatibility. In 8.5, they’ll now trigger a deprecation notice.SplObjectStoragemethods: Thecontains(),attach(), anddetach()methods are deprecated. Use theArrayAccessequivalents —offsetExists(),offsetSet(), andoffsetUnset()— instead.
- New in PHP 8.5: Marking Return Values as Important
- New in PHP 8.5: Attributes on Constants
- New in PHP 8.5: Levenshtein Comparison for UTF-8 Strings
- New in PHP 8.5: Final Promoted Properties
- New in PHP 8.5: The Pipe Operator
- New in PHP 8.5: Asymmetric Visibility for Static Properties
- New in PHP 8.5: Closures as Constant Expressions