PHP 8.5 新功能全解析,php开发必备!

AI 概述
管道运算符实例array_first() 和 array_last()新的 URI 扩展检索当前正在执行的闭包常量表达式中对闭包的支持PHP 致命错误回溯INI 差异选项时间安排了解更多 PHP 8.5 将于下个月(2025 年 11 月 20 日)发布,为我们带来了许多令人惊喜的好消息,让我们一起先看看吧! 管道运算符 新增 array_first()...
目录
文章目录隐藏
  1. 管道运算符
  2. array_first() 和 array_last()
  3. 新的 URI 扩展
  4. 检索当前正在执行的闭包
  5. 常量表达式中对闭包的支持
  6. PHP 致命错误回溯
  7. INI 差异选项
  8. 时间安排
  9. 了解更多

PHP 8.5 新功能全解析,php 开发必备!

PHP 8.5 将于下个月(2025 年 11 月 20 日)发布,为我们带来了许多令人惊喜的好消息,让我们一起先看看吧!

  • 管道运算符
  • 新增 array_first() 和 array_last() 函数
  • 新的 URI 扩展
  • 新版错误回溯与调试支持
  • INI 差异选项
  • 使 OPcache 成为 PHP 的非可选部分
  • 还有更多…

管道运算符

对于想要以更直观的方式将多个可调用函数依次串联、并让数据从左到右自然传递的 PHP 开发者来说,管道运算符无疑是一个令人期待的新特性。

$result = $value
  |> trim(...)
  |> strtoupper(...)
  |> htmlentities(...)
  |> strlen(...);
  
// 等于
$result = strlen(htmlentities(strtoupper(trim($value))));

实例

$arr = [
newWidget(tags: ['a', 'b', 'c']),
newWidget(tags: ['c', 'd', 'e']),
newWidget(tags: ['x', 'y', 'a']),
];

$result = $arr
    |> (fn($x) =>array_column($x, 'tags')) // Gets an array of arrays
    |> (fn($x) =>array_merge(...$x))       // Flatten that array into one big array
    |> array_unique(...)                  // Remove duplicates
    |> array_values(...)                  // Reindex the array.
;

// $result is ['a', 'b', 'c', 'd', 'e', 'x', 'y'. 'z']

array_first() 和 array_last()

PHP 8.5 将包含array_first()array_last()函数。虽然表面上看,这些函数似乎没什么大不了的(而且 PHP 社区已经有用户在框架上实现),但它们早就应该成为 PHP 语言的原生函数了。

// 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)

新的 URI 扩展

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 将通过获取当前正在执行的闭包来支持闭包中的递归。正如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);
};
 
var_dump($fibonacci(10));

常量表达式中对闭包的支持

PHP 8.5 引入了对常量表达式中闭包的支持,使得可以将默认属性值定义为 Closure,以及其他用例:

function my_array_filter(
    array $array,
    Closure $callback = static function ($item) { return !empty($item); },
) {
    $result = [];

    foreach ($arrayas$item) {
        if ($callback($item)) {
            $result[] = $item;
        }
    }

    return$result;
}

my_array_filter([
    0, 1, 2,
    '', 'foo', 'bar',
]); // [1, 2, "foo", "bar"]

PHP 致命错误回溯

新增的 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}

INI 差异选项

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 日发布的 正式版:

PHP 8.5 发布时间安排表

了解更多

PHP 8.5 即将推出更多更新,您可以查看 11 月即将发布的 PHP 8.5 RFC 完整列表。PHP 8.5 准备任务页面包含即将发布的版本的时间表。要立即开始使用 PHP 8.5,您可以从下载页面下载 PHP 8.5 RC 源代码。最后,如果您想抢先升级,可以查看PHP 8.5 弃用功能列表。

以上关于PHP 8.5 新功能全解析,php开发必备!的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

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

微信微信 支付宝支付宝

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

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

发表回复