PHP 8.6 is on the way: the language's steady evolution
Before PHP 8.6 ships: why predictable annual releases and 'boring' versions of a mature language are actually good news.
PHP 8.6 is coming out in a few weeks — on November 19, 2026, according to the release schedule. I’m writing this — as I do every year — before the release is out, working from the RFCs and the release candidate packages. I won’t be giving you a full list of new features; this post isn’t really about one release. It’s about the steady evolution PHP has been quietly sustaining for years.
A predictable cadence
PHP has been shipping a minor release every year since 2020. With a single exception — 8.2, which landed on December 8, 2022 — the date has always been November, and the last three releases have all fallen between November 20 and 23. The more time passes, the more I appreciate that regularity. Knowing when a release is coming makes planning possible: teams can schedule upgrades on their calendars, library maintainers can prepare, and nobody gets caught off guard.
A tempo that’s reliable rather than exciting — that’s the hallmark of a mature technology. A language you eagerly await every year wondering “what’s coming this time?” is also a language you’d hesitate to build a decade-long project on.
What I do before a release ships
My routine before every release is the same. I read through the RFC list and look at what got accepted. I try the release candidate just enough to run the tests of a project I work on against it. I pay close attention to deprecated features.
There’s a detail in this schedule that is exactly what makes release day boring: the feature list freezes in September. For 8.6, the hard feature freeze was September 22, 2026; after that date no new feature goes into the release, only bug fixes. So there is nothing we learn in November — November only ships what was already settled in September.
This year’s list follows the familiar pattern. The one visible syntax addition is partial function application (PFA): the RFC passed 33 to 0 and its status is “Implemented”. The rest is cleanup — the 8.6 deprecation list is a long one; returning from a finally block, for instance, now raises a deprecation warning (39 in favour, 3 against).
The secret to evaluating a new release “as soon as it ships” is to have been following it before it ships. If release day is full of surprises, you’re already behind.
I don’t rush to adopt new features
The moment a language release lands, everyone gets excited about putting the new features into their code. These days, I prefer to wait.
I reach for a feature when I see it solving a real problem — not because it’s new. New syntax doesn’t always mean better code; sometimes it just means newer code. PHP’s additions over recent years — the maturation of the type system, the growing support for immutability — have genuinely changed how I write code. But adopting them took months, sometimes a year. Not rushing isn’t a loss; it’s a filter.
How I plan upgrades
My approach to adopting a new minor release has settled into a pattern over the years. I don’t move it to production the moment it ships; I give it a waiting period first.
The first step is waiting for the libraries I use to become compatible with the new version. When a language release lands, the whole ecosystem isn’t ready the same day — it takes a few weeks, sometimes a few months. Jumping in early and wrestling with an incompatible dependency costs more time than it saves.
The second step is starting the migration with smaller projects. I move a personal or low-risk project to the new version first; if everything is fine there and the tests are green, I move on to larger projects. This sequence means I discover any surprises at the cheapest possible point.
The third step is cleaning up deprecated features. Adding new features is the exciting part; but the real work is removing deprecated ones in time. Ignoring a deprecation warning is just choosing to turn it into a real error in the next major release. There is no announced timeline for PHP 9.0 — but you pay the bill for accumulated warnings on the day it arrives.
Closing thoughts
PHP 8.6’s contents were frozen back in September; I know the list. What I don’t know is how much room these features will take up in my own code — I can only tell you that after running the release on a real project for a few months. But there’s one thing I already know: PFA aside, this is, like the ones before it, a release that doesn’t transform the language dramatically — it matures it one step further. In a long-lived language, that’s exactly what I’m looking for. Not spectacle, but continuity.
The research behind this post
The PHP ecosystem does not wait for a new release — but it does not declare support either
After a PHP release ships, when do the 500 most-installed Composer packages declare that they support it, and how much does that declaration actually say?
Finding
56.4% of installs arrive on a constraint with no upper bound at all — symfony/console says >=8.4.1 today, which claims support for PHP 12 as well. Of the 280 packages that do close the top, 247 made the commitment before the version existed: guzzlehttp/guzzle covered 8.4 in October 2020, four years early. That leaves 33 packages that genuinely waited, at a median of 325 days. The raw medians fall version over version and read as an ecosystem speeding up; restricted to an equal observation window the trend reverses (238 → 215 → 325 days).
checked 71 days ago
Experiments on this topic
PHP packages that stand alone and still work together
How a family of over 30 PHP packages stayed usable standalone and together, and why the Lab record closed while the packages stay maintained.
What it does today
A family of over 30 PHP packages — Router, Database, Cache, Mailer, Socket and the rest — each usable standalone or together, all shipped through Composer/Packagist under MIT. Any PHP developer who wants the pieces without buying into a framework can install them today.
Comments
Sign in with your GitHub account to join the discussion. Comments are stored in GitHub Discussions.