PHP 8.5 正式发布

PHP 8.5
PHP 开发者们!2025 年对 PHP 生态系统来说注定是一个激动人心的一年。经过漫长的等待,PHP 8.5 终于正式发布,带来了我们一直期待的一些超级酷炫的功能。让我们一起来深入了解即将到来的内容吧!
1. 管道操作符 (|>) – 明星功能!
这是每个人都在等待的功能!管道操作符允许您从左到右链式调用多个可调用对象,将左侧可调用对象的返回值传递给右侧的一个。
在 PHP 8.5 之前,如果您想对数据执行一系列操作,就必须写出这样的代码:
// 方法 1:嵌套函数调用,让人眼花缭乱
$result = trim(str_shuffle(strtoupper("Hello World")));
// 方法 2:使用临时变量(冗长且杂乱)
$result = "Hello World";
$result = strtoupper($result);
$result = str_shuffle($result);
$result = trim($result);
借助 PHP 8.5 中的管道操作符,上面的代码变得更加优雅:
$result = "Hello World" |> strtoupper(...) |> str_shuffle(...) |> trim(...); // 输出:"LWHO…"
2. 原生 array_first() 和 array_last() 函数
PHP 8.5 引入了 array_first() 和 array_last() 函数,用于从数组中获取第一个和最后一个值,补充了 PHP 7.3 中的 array_key_first() 和 array_key_last()。这些函数处理非整数键,不会修改数组的内部迭代器。
示例:
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'
3. 新的 URI 扩展
PHP 8.5 引入了一个新的 URI 扩展,它是 RFC 3986 和 WHATWG URL 标准的合规解析器,作为标准库的一部分提供。
示例:
use Uri\Rfc3986\Uri;
$url = new Uri('HTTPS://thephp.foundation:443/sp%6Fnsor/');
$defaultPortForScheme = match ($url->getScheme()) {
'http' => 80,
'https' => 443,
'ssh' => 22,
default => null,
};
// 从 URL 中移除默认端口。
if ($url->getPort() === $defaultPortForScheme) {
$url = $url->withPort(null);
}
echo $url->toString(), PHP_EOL;
// 输出:https://thephp.foundation/sponsor/
4. 获取当前执行的闭包(Closure::getCurrent())
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"; // 输出:55
5. 常量表达式中支持闭包
PHP 8.5 引入了对常量表达式中闭包的支持,允许将闭包用作默认属性值等。
示例:
function my_array_filter(
array $array,
Closure $callback = static function ($item) { return !empty($item); },
) {
$result = [];
foreach ($array as $item) {
if ($callback($item)) {
$result[] = $item;
}
}
return $result;
}
my_array_filter([
0, 1, 2,
'', 'foo', 'bar',
]); // [1, 2, "foo", "bar"]
6. PHP 致命错误回溯(fatal_error_backtraces)
新的 fatal_error_backtraces 设置控制是否为致命错误显示回溯,默认值为 1。这适用于解析错误、重复函数或类、无限循环等。
示例输出:
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}
7. INI 差异选项(–ini=diff)
PHP 8.5 引入了 php --ini 标志的 INI 差异选项,用于识别配置中更改的 INI 值。
示例:
$ php --ini=diff Non-default INI settings: allow_url_include: "0" -> "" auto_append_file: (none) -> "" ...
8. #[\NoDiscard] 属性
允许标记函数,如果返回值被丢弃(未使用或未显式转换为 void),则发出警告。帮助防止忽略昂贵计算的 bug。
9. 带覆盖的 clone()
修改 clone 操作以接受第二个参数作为属性覆盖数组,便于创建对象的修改副本,尤其适用于只读类和值对象。
10. PHP_BUILD_DATE 常量
新常量,返回 PHP 安装的构建日期。
此外,OPcache 扩展现在静态编译到 PHP 核心中,确保始终可用。
4 个关键弃用项
PHP 8.5 引入了一些弃用,以清理遗留代码。以下是 4 个关键的:
- 反引号作为 shell_exec 的别名:弃用反引号操作符(
`)用于 shell 执行,因为它容易混淆且缺乏错误处理;推荐使用shell_exec()。 - __sleep() 和 __wakeup() 魔术方法:弃用这些序列化方法,转而使用 PHP 7.4 中的改进
__serialize()和__unserialize()。 - 非标准类型转换名称:弃用如
(integer)、(boolean)、(double)和(binary)等转换,转而使用标准(int)、(bool)、(float)和(string)。 - switch 语句中 case 后的分号:弃用用分号终止
case语句的遗留语法,转而使用冒号。
这些变化旨在使 PHP 更现代、更安全。准备好升级到 PHP 8.5 了吗?更多细节请参考官方 RFC 和文档。
以上关于PHP 8.5 正式发布的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » PHP 8.5 正式发布

微信
支付宝