首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >PHP 8.5 正式发布!

PHP 8.5 正式发布!

作者头像
Tinywan
发布2026-07-01 12:16:50
发布2026-07-01 12:16:50
1160
举报
文章被收录于专栏:开源技术小栈开源技术小栈

PHP 8.5

嘿,PHP 开发者们!2025 年对 PHP 生态系统来说注定是一个激动人心的一年。经过漫长的等待,PHP 8.5 终于正式发布,带来了我们一直期待的一些超级酷炫的功能。让我们一起来深入了解即将到来的内容吧!

1. 管道操作符 (|>) - 明星功能!

这是每个人都在等待的功能!管道操作符允许您从左到右链式调用多个可调用对象,将左侧可调用对象的返回值传递给右侧的一个。

在 PHP 8.5 之前,如果您想对数据执行一系列操作,就必须写出这样的代码:

代码语言:javascript
复制
// 方法 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 中的管道操作符,上面的代码变得更加优雅:

代码语言:javascript
复制
$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()。这些函数处理非整数键,不会修改数组的内部迭代器。

示例:

代码语言:javascript
复制
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 标准的合规解析器,作为标准库的一部分提供。

示例:

代码语言:javascript
复制
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() 获取当前执行的闭包。

示例(斐波那契数列):

代码语言:javascript
复制
$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 引入了对常量表达式中闭包的支持,允许将闭包用作默认属性值等。

示例:

代码语言:javascript
复制
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。这适用于解析错误、重复函数或类、无限循环等。

示例输出:

代码语言:javascript
复制
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 值。

示例:

代码语言:javascript
复制
$ 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 个关键的:

  1. 反引号作为 shell_exec 的别名:弃用反引号操作符(`)用于 shell 执行,因为它容易混淆且缺乏错误处理;推荐使用 shell_exec()
  2. __sleep() 和 __wakeup() 魔术方法:弃用这些序列化方法,转而使用 PHP 7.4 中的改进 __serialize()__unserialize()
  3. 非标准类型转换名称:弃用如 (integer)(boolean)(double)(binary) 等转换,转而使用标准 (int)(bool)(float)(string)
  4. switch 语句中 case 后的分号:弃用用分号终止 case 语句的遗留语法,转而使用冒号。

这些变化旨在使 PHP 更现代、更安全。准备好升级到 PHP 8.5 了吗?更多细节请参考官方 RFC 和文档。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-11-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PHP 8.5
  • 1. 管道操作符 (|>) - 明星功能!
  • 2. 原生 array_first() 和 array_last() 函数
  • 3. 新的 URI 扩展
  • 4. 获取当前执行的闭包(Closure::getCurrent())
  • 5. 常量表达式中支持闭包
  • 6. PHP 致命错误回溯(fatal_error_backtraces)
  • 7. INI 差异选项(--ini=diff)
  • 8. #[\NoDiscard] 属性
  • 9. 带覆盖的 clone()
  • 10. PHP_BUILD_DATE 常量
  • 4 个关键弃用项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档