亲爱的们,PHP 8.5 将于下个月(2025 年 11 月 20 日)发布。它将包含管道运算符、新的 URI 扩展、新的array_first()
和array_last()
函数等。
我来总结如下:
https://php.watch/versions/8.5/rfcs
对于希望将多个可调用函数链接在一起,并以本地方式从左到右传递值的 PHP 开发者来说,管道运算符是一个令人兴奋的前景。
有代码有真相:
// Using the pipe operator in PHP 8.5
$result ="Hello World"
|>htmlentities(...)
|>str_split(...)
|>fn($x) => array_map(strtoupper(...), $x)
|>fn($x) => array_filter($x, fn($v) => $v !='O');
PHP 8.5 将包含array_first()
和array_last()
函数。表面上看,这些函数似乎没什么大不了的(而且 PHP 社区已经有用户空间的实现和 polyfill),但它们早就应该成为 PHP 的原生函数了。
这些函数补充了 PHP 7.3 中合并已提供的数组键的一系列方法:
在 PHP 7.3 中,我们使用 get
array_key_first()
和 array_key_last()
来获取数组的第一个和最后一个键。但我们目前还没有办法获取数组的第一个和最后一个值。这比你想象的要难,因为:
- 数组键不一定是整数,不一定以 0 开头,等等原因......
- 现有的“技巧”例如
reset()
和end()
从语义上讲是错误的,因为它们修改了数组的“内部迭代器”。此外,它也不能在所有类型的表达式上正常工作(例如,从函数/普通数组返回的数组可能会因为 by-ref 参数而引发错误)。- 使用起来
$array[array_key_first($array)]非常
麻烦。
这里有一些函数及其工作原理的示例:array_first()
array_last()
// Function signatures
function array_first(array $array):mixed {}
function array_last(array $array):mixed {}
// Examples
array_first(["single element"]); // "single element"
array_last(["single element"]); // "single element"
array_first([]); // NULL
array_last([]); // NULL
array_first([1=>'a', 0=>'b', 3=>'c', 2=>'d']); // 'a'
array_last([1=>'a', 0=>'b', 3=>'c', 2=>'d']); // 'd'
$str ="hello";
array_first([&$str, false]); // "hello" (no ref)
array_last([false, &$str]); // "hello" (no ref)
在 PHP 8.5 中引入了一个新的URI 扩展,它是一个符合标准的解析器,“同时适用于 RFC 3986 和 WHATWG URL 标准,作为其标准库中新的‘URI’扩展中始终可用的一部分”。
RFC 中有很多示例,这里有一个来自PHP 基金会公告帖子的例子,展示了 RFC 3986 的 Uri 类:
use Uri\Rfc3986\Uri;
$url = newUri('HTTPS://thephp.foundation:443/sp%6Fnsor/');
$defaultPortForScheme =match ($url->getScheme()) {
'http'=>80,
'https'=>443,
'ssh'=>22,
default=>null,
};
// Remove default ports from URLs.
if ($url->getPort() === $defaultPortForScheme) {
$url = $url->withPort(null);
}
// Getters normalize the URL by default. The `Raw`
// variants return the input unchanged.
echo $url->toString(), PHP_EOL;
// Prints: https://thephp.foundation/sponsor/
echo $url->toRawString(), PHP_EOL;
// Prints: HTTPS://thephp.foundation/sp%6Fnsor/
PHP 8.5 将通过获取当前正在执行的闭包来支持闭包中的递归,这要感谢Alexandre Daubois。
正如rfc:closure_self_reference RFC中所指出的,当前的解决方法是将变量引用绑定到闭包中。
PHP 8.5 提供了静态方法Closure::getCurrent()
获取当前正在运行的闭包:
$fibonacci =function (int $n) {
if (0=== $n ||1=== $n) {
return $n;
}
$fn =Closure::getCurrent();
return $fn($n -1) + $fn($n -2);
};
echo $fibonacci(10) ."\n";
新增的fatal_error_backtraces设置可以控制是否显示致命错误的回溯。
fatal_error_backtraces
设置在 PHP 8.5 中是默认显示的,即为1
——你无需配置任何内容即可获取这些回溯(当然,您也可以根据需要禁用它们)。
在当前的 PHP 稳定版本(例如 PHP 8.4)中,不显示回溯的致命错误可能包括解析错误(语法错误)、重复的函数或类、具有最大执行时间的无限循环等。
Fatal error: Cannot redeclare class B (previously declared in /srv/app/index.php:11) in /srv/app/b.php on line 3
Stack trace:
#0 /srv/app/index.php(6): require()
#1 /srv/app/index.php(21): A->loadClassB()
#2 {main}
PHP 8.5为该标志引入了一个INI diff 选项php --ini
,这样可以轻松识别配置中更改的 INI 值。该--ini
标志有助于显示已加载的 php.ini 配置文件以及已解析的其他 .ini 文件。
如下命令:
$ php --ini=diff
Non-default INI settings:
allow_url_include: "0" -> ""
auto_append_file: (none) -> ""
auto_prepend_file: (none) -> ""
display_errors: "1" -> ""
display_startup_errors: "1" -> ""
enable_dl: "1" -> ""
error_reporting: (none) -> "22527"
...
PHP 8.5 的剩余发布计划包括两个候选版本,然后在 11 月 20 日发布 GA 版本:
日期 | 版本名称 |
---|---|
2025年7月3日 | Alpha 1 |
2025年7月17日 | Alpha 2 |
2025年7月31日 | Alpha 3(已跳过) |
2025年7月31日 | Alpha 4 |
2025年8月12日 | 功能冻结 |
2025年8月14日 | Beta 1 |
2025年8月28日 | Beta 2 |
2025年9月11日 | Beta 3 |
2025年9月25日 | RC1 |
2025年10月9日 | RC2 |
2025年10月23日 | RC3 |
2025年11月6日 | RC4 |
2025年11月20日 | 遗传算法 |
以上表格仅是部分内容,相信PHP 8.5 会推出更多更新,敬请留意 11 月发布的 PHP 8.5 RFC 完整列表。如果要立即开始使用 PHP 8.5,可以从下载页面下载 PHP 8.5 RC 源代码。
最后,如果想抢先升级,可以查看PHP 8.5 弃用功能列表😎。
作者:洛逸
本篇文章为 @ 场长 创作并授权 21CTO 发布,未经许可,请勿转载。
内容授权事宜请您联系 webmaster@21cto.com或关注 21CTO 公众号。
该文观点仅代表作者本人,21CTO 平台仅提供信息存储空间服务。
请扫描二维码,使用微信支付哦。