21CTO导读:PHP 8.6特性和功能提前预览。
PHP 的年度大版本即将到来——PHP 8.6 正式版将于 2026年11月19号发布。
目前它已经进入 Beta 测试阶段;9 月 22 号将执行功能冻结,两天后发布第一个 RC 候选版本。
PHP 8.6 准备页面给出的版本节奏,如下时间轴:
该版本的产品负责人:Daniel Scherzer、Matteo Beccati、Joe Ferguson。
部分函数应用允许预先填充一部分函数参数,返回一个接收剩余参数的闭包。? 代表后续传入单个参数占位符;... 代表剩余全部参数。
$makeSlug = str_replace(' ', '-', ?);$makeSlug('Hello World'); // Hello‑World$titles = array_map(strtolower(?), $titles);
生成的闭包会完整保留原函数的参数名、类型声明与默认值。预先传入的参数在生成偏函数时求值,而不是调用闭包的时候才求值。
配套的后续 RFC 规定:每一个 ? 占位符,在生成的闭包上都会成为必传参数,即便原函数的该参数是可选参数。
该提案旧版本 2021 年被否决;第二版 RFC 以 33 票赞成、0 票反对获得通过。
新增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)。
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。Io\Poll,为 PHP 提供统一封装的 IO 多路复用接口:Linux 下 epoll、BSD/macOS 下 kqueue、Solaris event ports、Windows WSAPoll。 对于用户态实现事件循环、异步运行时的开发者,可以用来替代旧的stream_select()。use Io\Poll\{Context, Event, StreamPollHandle};$poll = new Context();$server = stream_socket_server('tcp://0.0.0.0:8080');stream_set_blocking($server, false);$poll->add(new StreamPollHandle($server), [Event::Read], ['type' => 'server']);while (true) {foreach ($poll->wait(1) as $watcher) {if ($watcher->hasTriggered(Event::Read)) {// accept the connection}}}
RFC 说明该 API 首要目标服务 PHP 内部,例如信号处理、FPM 改进;其次供用户态异步框架使用。参考 Polling API RFC。SortDirection,包含Ascending升序、Descending降序两个 case。 目前 PHP 内核还没有函数直接接收该枚举;RFC 目的是提供统一标准类型,避免各个类库各自定义排序枚举,查询构建器是典型使用场景。$query->orderBy('created_at', SortDirection::Descending);枚举支持 __debugInfo () 魔术方法
PHP8.1 刚引入枚举时,禁止枚举定义大部分魔术方法。 PHP8.6 放开限制,允许枚举实现__debugInfo(),该魔术方法不依赖实例状态,用来自定义var_dump()输出内容。
enum Status: int{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 = new Uri\Rfc3986\UriBuilder()->setScheme('https')->setHost('example.com')->setPath('/foo/bar')->build();
配套 RFC 还新增了getUriType()、getHostType()方法,以及针对 URI 各组成部分的百分号编码函数。
全新安装环境下,php.ini 三个 session 配置项更新默认值:
session.use_strict_mode | 0 | 1 |
session.cookie_httponly | 0 | 1 |
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
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 微信公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。