Software 44694 Published by

PHP 8.6.0 Beta 1 was tagged on August 11, 2025, introducing Partial Function Application, a native Io\Poll I/O API, and a dedicated Time\Duration class. The release enforces stricter error handling across the standard library, replacing silent truncation with ValueError and TypeError exceptions while validating NUL bytes in string arguments. Session security defaults now enable use_strict_mode and cookie_httponly by default, and dozens of legacy functions are officially deprecated ahead of PHP 9.0. 



PHP 8.6.0 Beta 1 Lands With Partial Function Application, Native Polling API, and a Hard Shift Toward Strict Errors

The first official marker for PHP 8.6 arrives with modern syntax, platform-backed I/O multiplexing, and a systematic push to replace silent failures with typed exceptions.

PHP 8.6.0 Beta 1 was tagged by Joe Ferguson on August 11, 2025. The release brings Partial Function Application, a new Io\Poll I/O multiplexing API, a dedicated Time\Duration class, and a wholesale upgrade to error handling across the standard library. It ships roughly nine months after PHP 8.5.0, and it contains dozens of RFCs that have been merged since that cutoff.

The long wait between 8.5 and this beta was largely due to memory and storage supply chain snags that forced Valve to reconsider its own shipping timelines for nearby hardware, but the PHP team moved through the release cycle on schedule regardless. This is the first build you should actually run against your test suite if you are still on 8.5.

Phpel

The headline features

Partial Function Application is the big one. If you have ever written a wrapper function just to bind an argument, you know the pain. PHP 8.6 finally treats it as a first-class construct. You use ? as a positional placeholder and ... to swallow everything else. The engine preserves type hints and return signatures from the underlying function via reflection, and it compiles the whole thing down to a direct loop when used with the pipe operator. The RFC passed 33-0.

Time\Duration rounds out the syntax additions. It is a final readonly class that tracks elapsed time with nanosecond precision. No timezone math. No calendar drift. Just intervals. You can chain arithmetic, parse ISO-8601 strings, and pass it straight to sleep(). The Time namespace is being positioned as the foundation for a complete date and time overhaul in upcoming versions. Expect Instant and CalendarInterval to build on top of it later.

Io\Poll replaces stream_select() with something that actually scales. It auto-selects epoll on Linux, kqueue on macOS and BSD, event ports on Solaris, and WSAPoll on Windows. The userspace surface is intentionally small. It provides polling, not a full event loop. ReactPHP, AmpHP, and Revolt will likely adopt it as their backend without depending on libuv. It is also the engine behind PHP-FPM's new signal handling and FrankenPHP's goroutine-based TSRM mode.

#[\NoDiscard] rounds out the language additions. Mark a function with the attribute and PHP will emit a deprecation warning when you ignore the return value. The warning becomes a hard error in PHP 9. It is a useful safety net for functions where side effects matter, though I would not be surprised to see libraries abuse it just to generate noise.

The shift to strict errors

Here is where it gets boring but actually matters. NUL bytes in string arguments now throw ValueError instead of silently truncating. array_filter() rejects invalid modes. pathinfo() and scandir() fail loudly. Even sleep() and usleep() clamp to platform limits rather than rolling into undefined behavior. PHP has historically been forgiving about malformed input. That tolerance is ending.

Three session INI settings are flipping to more secure values out of the box. session.use_strict_mode now defaults to 1. session.cookie_httponly defaults to 1. session.cookie_samesite defaults to Lax. If your application relied on the old defaults to bypass certain cookie or session ID quirks, you will need to set them explicitly.

clone() is now also available as a standalone function. You can clone into a different class type at runtime using clone $obj with (Foo::class). The #[\Override] attribute finally works on class constants and enum cases. Enums can implement __debugInfo() for custom var_dump() output. final is now valid on promoted constructor properties. The pipe operator got refined to handle reference returns and interoperate cleanly with Partial Function Application.

Deprecations and the 9.0 horizon

A lot is being removed. Mbregex and the Oniguruma backend are deprecated. So are metaphone(), is_double(), doubleval(), and several SPL functions like spl_classes() and spl_object_hash(). The GMP operators lose their silent truncation behavior. You have a year to sort through the deprecation warnings before they turn fatal in PHP 9.

If you are running production workloads on 8.5, test this beta in a staging environment before committing to anything.

Head here to grab the full beta, and keep in mind that the official UPGRADING notes are already live on GitHub. Run your test suite. Watch what trips the new error checks. The strict era of PHP is officially here.