The PHP 8.6 RFC season wrapped up this week after a mass 35-ballot voting cycle. The final tally: 31 proposals accepted, 4 rejected.
Four proposals fell short. The list() deprecation ended in a flat 23–23 tie with one abstention—exactly 50 percent—far below the two-thirds threshold required. Reserving the keywords in, out, and inout failed at 8 to 21. The gettext _() alias survived with 10 to 22 against deprecation. The dechunk filter, disputed throughout voting, finished at 18 to 15 with 12 abstentions (54.5 percent) and remains in the language.
Several pivotal votes resolved from tied or uncertain positions. Reserving let passed at 24 to 11 with 9 abstentions (68.6 percent). Reserving is passed decisively at 29 to 10, despite concerns raised about the Hamcrest testing library's 500 million installations. The define() case-insensitivity flag removal passed 41 to 0 with no dissenting votes.
The final three ballots of the 8.6 season split 2–1. Caleb White's pipe assignment operator (|>=) was declined at 14 yes, 12 no, 7 abstentions (53.8 percent), falling short of the two-thirds requirement. Nick Sdot's readonly property defaults passed unanimously at 24 to 0 with 5 abstentions. Khaled Alam's const object property writes passed at 17 to 2 with 6 abstentions (89.5 percent).
One implementation change emerged late. Ilija Tovilo posted an update to the closure optimizations RFC (passed 24–0 in March). The original proposal included two features: a cache for stateless closures and automatic inference to mark closures as static. The inference portion was dropped after discovering an edge case: a closure can violate none of the RFC's rules yet still make instance calls via callable strings like "Foo::instanceCall" in array_map. Tovilo acknowledged the oversight and decided to merge only the stateless closure cache, which provides most of the performance benefit. Developers must mark closures static manually to achieve the full optimization.
The first RFC targeting PHP 8.7 has already been filed. Weilin Du proposed IntlRelativeDateTimeFormatter—a wrapper for ICU's locale-aware relative time formatting (e.g., "in 3 days", "last Sunday"). Discussion centered on whether it should accept the new Duration class; Du argued Duration represents stopwatch time while the formatter needs units (90 minutes vs. 1.5 hours, months, quarters), making them incompatible. The constructor gained an optional NumberFormatter parameter by Saturday.
Generics development continues outside the RFC process. Carlos Granados shared a pre-RFC based on Rob Landers's experimental reified branch, arguing it deserved deeper exploration. Rob suggested joining the community Discord at phpc.chat rather than working in isolation. Alexander Lisachenko independently posted a userland proof-of-concept where specialized generic classes share compiled method bodies, reducing memory overhead per specialization.
Liam Hammett's native markup expressions RFC (JSX-style HTML in PHP) received validation from T.J. L, the XHP extension maintainer, in his first internals post. He confirmed that static analysis tools cannot parse custom syntax—the core friction point with XHP—strengthening the case for native support. He requested three additions: context passing without attribute threading, inline SVG support, and noted that dropping per-tag objects removes runtime validation that JSX avoids primarily through TypeScript.
Minor items: Juris Evertovskis raised that isset() expressions in brackets still throw warnings despite isset silencing everything else. The did-you-mean error suggestions RFC is not being rushed—Jorg Sowa will complete it after feature freeze. Sepehr Mahmoudi joined the internals list with an array_search_range proposal.
PHP 8.6 beta 1 ships this week, marking the soft freeze. The RFC season is closed.
Comments
No comments yet — be the first.
Open the discussion
No account or password needed — just enter your e-mail and we’ll send you a one-time sign-in link. First time here? You’re set up automatically.
Your rating will be applied automatically after you sign in.
Check your inbox
We’ve sent a sign-in link to …. Open it on this device — this tab will sign you in automatically.
Nothing arrived? Check your spam folder — and mark the mail as "Not spam" so it lands in your inbox next time.