17611538698
webmaster@21cto.com

PHP 年度大版本:PHP 8.6 的新特性

编程语言 0 21 59分钟前
图片

21CTO导读:PHP 8.6特性和功能提前预览。

PHP 的年度大版本即将到来——PHP 8.6 正式版将于 2026年11月19号发布

目前它已经进入 Beta 测试阶段;9 月 22 号将执行功能冻结,两天后发布第一个 RC 候选版本。

看看发布时间轴


PHP 8.6 准备页面给出的版本节奏,如下时间轴:

  • Alpha1‑Alpha3:2026‑07‑02 ~ 07‑30
  • Beta1(软功能冻结):2026‑08‑13
  • Beta3:2026‑09‑10
  • 功能冻结:2026‑09‑22
  • RC1:2026‑09‑24
  • RC4:2026‑11‑05
  • GA(正式发布):2026‑11‑19


该版本的产品负责人:Daniel Scherzer、Matteo Beccati、Joe Ferguson。

部分函数应用(Partial Function Application,PFA)


部分函数应用允许预先填充一部分函数参数,返回一个接收剩余参数的闭包。? 代表后续传入单个参数占位符;... 代表剩余全部参数。

$makeSlug = str_replace(' ''-'?);$makeSlug('Hello World'); // HelloWorld$titles = array_map(strtolower(?)$titles);
生成的闭包会完整保留原函数的参数名、类型声明与默认值。预先传入的参数在生成偏函数时求值,而不是调用闭包的时候才求值。 

配套的后续 RFC 规定:每一个 ? 占位符,在生成的闭包上都会成为必传参数,即便原函数的该参数是可选参数。

该提案旧版本 2021 年被否决;第二版 RFC 以 33 票赞成、0 票反对获得通过。

clamp () 函数族


新增clamp():如果传入值落在最小 / 最大区间内,则直接返回原值;超出边界则返回距离最近的边界值。

clamp(10, min: 0, max: 100); // 10clamp(101, min: 0, max: 100); // 100clamp(-1, min: 0, max: 100); // 0
支持所有可比较类型,包含字符串、DateTime 对象。如果传入的最小值大于最大值,会抛出ValueError。 该函数用来替代广为使用但容易写反的写法:min(max($value, $min), $max)

Duration 时间时长类


PHP8.6 新增Time\Duration,这是一个final readonly类,用于表示秒表式时间长度,支持纳秒精度。 提供各时间单位的工厂方法、算术运算方法,同时支持比较运算符。

use Time\Duration;$oneSecond Duration::fromSeconds(1);$halfSecond $oneSecond->divideBy(2);$total $oneSecond->add($halfSecond);$delay Duration::fromMilliseconds(100)->multiplyBy(2 ** $attempt);$total $delay// 可直接使用比较运算符
也可以通过 ISO 8601 时长字符串构建实例。该类作为标准类型,供内核与新的轮询 API 接收使用,替代松散的整数、浮点数时间值。完整方法列表参考 Duration RFC。

只读属性支持默认值


PHP8.6 起,readonly属性可以设置默认值。 8.6 版本之前,这么写属于编译错误;这让实现 PHP8.4 只读接口属性时,写固定默认值非常别扭。

final readonly class CreateBooksTable implements Migration{    public string $name '2026_01_01_create_books_table';}
RFC 仅移除语法限制;readonly 语义不变,初始化之后依旧不能重新赋值。


函数参数直接书写文档注释


现在可以直接给参数写文档注释,ReflectionParameter::getDocComment()可以读取该注释。 不再需要在函数上方的@param标签重复写参数名称。


function search(    /** Terms to search for in the database */    string $query,    /** Maximum number of entries to return */    int $limit 10,): array {    // ...}
静态分析工具与 IDE 可以直接读取参数上的注释。参考参数文档注释 RFC。


Polling(轮询)API


全新命名空间Io\Poll,为 PHP 提供统一封装的 IO 多路复用接口:Linux 下 epoll、BSD/macOS 下 kqueue、Solaris event ports、Windows WSAPoll。 对于用户态实现事件循环、异步运行时的开发者,可以用来替代旧的stream_select()


use Io\Poll\{ContextEventStreamPollHandle};$poll new Context();$server stream_socket_server('tcp://0.0.0.0:8080');stream_set_blocking($serverfalse);$poll->add(new StreamPollHandle($server), [Event::Read], ['type' => 'server']);while (true) {    foreach ($poll->wait(1as $watcher) {        if ($watcher->hasTriggered(Event::Read)) {            // accept the connection        }    }}
RFC 说明该 API 首要目标服务 PHP 内部,例如信号处理、FPM 改进;其次供用户态异步框架使用。参考 Polling API RFC。


SortDirection 枚举


内置全局枚举SortDirection,包含Ascending升序、Descending降序两个 case。 目前 PHP 内核还没有函数直接接收该枚举;RFC 目的是提供统一标准类型,避免各个类库各自定义排序枚举,查询构建器是典型使用场景。


$query->orderBy('created_at'SortDirection::Descending);
枚举支持 __debugInfo () 魔术方法

PHP8.1 刚引入枚举时,禁止枚举定义大部分魔术方法。 PHP8.6 放开限制,允许枚举实现__debugInfo(),该魔术方法不依赖实例状态,用来自定义var_dump()输出内容。

enum Statusint{    case Ok = 200;    public function __debugInfo(): array    {        return [__CLASS__ . '::' . $this->name . ' = ' . $this->value];    }}
流(Stream)统一错误处理模型


流增加统一错误模型。新增error_mode上下文选项,可选:警告、抛出异常、静默;stream_last_errors()返回结构化StreamError对象,获取上一次操作的错误。

$context stream_context_create([    'stream' => ['error_mode' => StreamErrorMode::Exception],]);try { $stream fopen('/nonexistent/file.txt''r'false$context);catch (StreamException $e) {    foreach ($e->getErrors() as $error) {        echo $error->code->name . ': ' . $error->message;    }}
StreamErrorCode枚举定义超过 50 个语义化错误码。参考 Stream Error Handling RFC。


URI 扩展增强(PHP8.5 延续改进)


PHP8.5 引入的 URI 扩展,新增 Builder 构建器类。无需创建大量中间对象,即可组装 URI。


$uri new Uri\Rfc3986\UriBuilder()    ->setScheme('https')    ->setHost('example.com')    ->setPath('/foo/bar')    ->build();

配套 RFC 还新增了getUriType()getHostType()方法,以及针对 URI 各组成部分的百分号编码函数。

Session 会话安全默认值变更


全新安装环境下,php.ini 三个 session 配置项更新默认值:

配置项
旧默认值
新默认值
session.use_strict_mode01
session.cookie_httponly01
session.cookie_samesite
未设置
Lax

而 Laravel 框架自行接管 Session Cookie,绝大多数 Laravel 项目不受影响。直接使用 PHP 原生 Session 并且依赖旧默认配置的应用,请先阅读 Session defaults RFC。

PHP 8.6在发布前一定还会有变化,但可以预知的是会带给开发者更多惊喜。

作者:Paul Redmond,Laravel News 专职撰稿人,全栈开发者、技术图书作者。

编译:场长

来源:

https://laravel-news.com/php-8-6

评论

我要赞赏作者

请扫描二维码,使用微信支付哦。

分享到微信