AI 概述
PHP 8.5 正式发布,带来诸多新特性:新增管道操作符,使链式调用更优雅;引入原生 array_first()和 array_last()函数;有新 URI 扩展,提供合规解析器;支持闭包递归与常量表达式中使用闭包;新增 fatal_error_backtraces 设置、INI 差异选项等;还有#[\NoDiscard]属性、带覆盖的 clone()等。同时,弃用反引号执行 shell、__sleep()和__wakeup()魔术方法、非标准类型转换名称、switch 中 case 后分号等。OPcache 扩展静态编译进核心,确保可用。
目录
文章目录隐藏
  1. PHP 8.5
  2. 1. 管道操作符 (|>) – 明星功能!
  3. 2. 原生 array_first() 和 array_last() 函数
  4. 3. 新的 URI 扩展
  5. 4. 获取当前执行的闭包(Closure::getCurrent())
  6. 5. 常量表达式中支持闭包
  7. 6. PHP 致命错误回溯(fatal_error_backtraces)
  8. 7. INI 差异选项(–ini=diff)
  9. 8. #[\NoDiscard] 属性
  10. 9. 带覆盖的 clone()
  11. 10. PHP_BUILD_DATE 常量
  12. 4 个关键弃用项

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 个关键的:

  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 和文档。

以上关于PHP 8.5 正式发布的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

2

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » PHP 8.5 正式发布

发表回复