令人期待的PHP7.4

[复制链接]
查看1773 | 回复5 | 2019-1-7 20:01:21 | 显示全部楼层 |阅读模式

PHP 7.4 是下一个 PHP 7 的次要版本,预计将于 2019 年 11 月 28 日发布到 General Availability。让我们来了解下 PHP 7.4 新增的功能,这将使 PHP 更快,更可靠。

当然,更令我期待是 PHP 8。因为 JIT 的一些提议,已经获得批准,这可能成为 PHP 的又一个里程碑。

使用 PHP 7.4 的 PHP 有什么新功能?

● 支持数组内解包 - 数组扩展运算符

● 箭头函数 2.0 (更加简短的闭包)

PHP 7.4 在数组表达式中引入 Spread 运算符

自 PHP 5.6 起可用,参数解包是将数组和 Traversable 解包为参数列表的语法。要解压一个数组或 Traversable,必须以 ...(3 点)为前缀,如下例所示:

  function test(...$args) { var_dump($args); }
  test(1, 2, 3);

然而 PHP 7.4 RFC 建议将此功能扩展到数组中去定义:

  $arr = [...$args];

Spread 运算符的第一个好处就是性能,RPC 文档指出:

Spread 运算符应该比 array_merge 拥有更好的性能。这不仅仅是 Spread 运算符是一个语法结构,而 array_merge 是一个方法。还是在编译时,优化了高效率的常量数组

Spread 运算符的一个显着优点是它支持任何可遍历的对象,而该 array_merge 函数仅支持数组。

以下是数组中参数带有 Spread 运算符的示例:

   $parts = ['apple', 'pear'];
  $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
  var_dump($fruits);

如果在 PHP 7.3 或更早版本中运行此代码,PHP 会抛出一个 Parse 错误:

Parse error: syntax error, unexpected '...' (T_ELLIPSIS), expecting ']' in /app/spread-operator.php on line 3

相反,PHP 7.4 将返回一个数组

array(5) {
    [0]=>
    string(6) "banana"
    [1]=>
    string(6) "orange"
    [2]=>
    string(5) "apple"
    [3]=>
    string(4) "pear"
    [4]=>
    string(10) "watermelon"
  }

RFC 声明我们可以多次扩展同一个数组。此外,我们可以在数组中的任何位置使用 Spread Operator 语法,因为可以在 spread 运算符之前或之后添加常规元素。因此,以下代码将按预期工作:

$arr1 = [1, 2, 3];
  $arr2 = [4, 5, 6];
  $arr3 = [...$arr1, ...$arr2];
  $arr4 = [...$arr1, ...$arr3, 7, 8, 9];

也可以将函数返回的数组作为参数,放到新数组中:

function buildArray(){
    return ['red', 'green', 'blue'];
  }
  $arr1 = [...buildArray(), 'pink', 'violet', 'yellow'];

PHP 7.4 输出以下数组:

array(6) {
    [0]=>
    string(3) "red"
    [1]=>
    string(5) "green"
    [2]=>
    string(4) "blue"
    [3]=>
    string(4) "pink"
    [4]=>
    string(6) "violet"
    [5]=>
    string(6) "yellow"
  }

我们也可以使用生成器:

function generator() {
    for ($i = 3; $i <= 5; $i++) {
        yield $i;
    }
  }
  $arr1 = [0, 1, 2, ...generator()];

但不允许通过引用传递的方式。请考虑以下示例:

$arr1 = ['red', 'green', 'blue'];
  $arr2 = [...&$arr1];

如果我们尝试通过传递引用的方式,PHP 会抛出以下 Parse 错误:

Parse error: syntax error, unexpected '&' in /app/spread-operator.php on line 3

如果第一个数组的元素是通过引用存储的,那么它们也通过引用存储在第二个数组中。这是一个例子:

   $arr0 = 'red';
  $arr1 = [&$arr0, 'green', 'blue'];
  $arr2 = ['white', ...$arr1, 'black'];

这是我们用 PHP 7.4 获得的:

array(5) {
    [0]=>
    string(5) "white"
    [1]=>
    &string(3) "red"
    [2]=>
    string(5) "green"
    [3]=>
    string(4) "blue"
    [4]=>
    string(5) "black"
  }

箭头函数 2.0 (简短闭包)

在 PHP 中,匿名函数被认为是非常冗长且难以实现和难以维护的,RFC 建议引入更简单,更清晰的箭头函数(或简短闭包)语法,这样我们就可以简洁地编写代码。

在 PHP 7.4 以前:

function cube($n){
    return ($n * $n * $n);
  }
  $a = [1, 2, 3, 4, 5];
  $b = array_map('cube', $a);
  print_r($b);

PHP 7.4 允许使用更简洁的语法,上面的函数可以重写如下:

$a = [1, 2, 3, 4, 5];
  $b = array_map(fn($n) => $n * $n * $n, $a);
  print_r($b);

目前,由于语言结构,匿名函数(闭包)可以使用 use 继承父作用域中定义的变量,如下所示:

$factor = 10;
  $calc = function($num) use($factor){
    return $num * $factor;
  };

但是在 PHP 7.4 中,父级作用域的值是通过隐式捕获的(隐式按值的作用域进行绑定)。所以我们可以用一行来完成一下这个函数:

$factor = 10;
  $calc = fn($num) => $num * $factor;

父级作用域定义的变量可以用于箭头函数,它跟我们使用 use 是等价的,并且不可能被父级所修改。

新语法是对语言的一个很大改进,因为它允许我们构建更易读和可维护的代码。

NULL 合并运算符

由于日常使用中存在大量同时使用三元表达式和 isset () 的情况, 我们添加了 null 合并运算符 (??) 这个语法糖。如果变量存在且值不为 NULL, 它就会返回自身的值,否则返回它的第二个操作数。

$username = $_GET['user'] ?? ‘nobody';

这段代码的作用非常简单:它获取请求参数并设置默认值(如果它不存在)。但是在 RFC 这个例子中,如果我们有更长的变量名称呢?

$this->request->data['comments']['user_id'] = $this->request->data['comments']['user_id'] ?? 'value';

长远来看,这段代码可能难以维护。因此,旨在帮助开发人员编写更直观的代码,这个 RFC 建议引入 null 合并等于运算符 (null_coalesce_equal_operator)??=,所以我们可以敲下面这段代码来替代上面的这段代码:

$this->request->data['comments']['user_id'] ??= ‘value’;

如果左侧参数的值为 null,则使用右侧参数的值。

注意,虽然 coalesce 运算符 ?? 是一个比较运算符,但 ??= 它是赋值运算符。

  • 微信
  • 分享
  • 相关标签:PHP7.4
  • 本文转载于:learnku,如有侵犯,请联系916990011@qq.com删除
    • 上一篇:正则表达式语法教程(含在线测试工具)
    • 下一篇:GitHub上50个最受欢迎的PHP开源项目【2019】

    相关文章

    相关视频

    • php7新特性是什么?
    • 彻底把 PHP7 说透,全面介绍 PHP7 新特性
    • php7.0 openssl_encrypt如何加...
    • php7垃圾回收机制详解
    • 令人期待的PHP7.4
    • PHP7新增常量
    • PHP7INI配置文件修改
    • PHP7windows支持
    • PHP7其他修改
    本文有爱上源码下载完入驻作者发布,如果对您版权造成侵害,可以联系本站站长管理进行维权删除,本站收到维权24小时内进行处理,谢谢您关注23ym.cn! 本站分享大量程序员技术文章以及对编程开发的初级入门教程,包括图文讲解笔记和高清视频下载~
    回复

    使用道具 举报

    也曾相识825 | 2021-11-2 07:55:47 | 显示全部楼层
    悟空源码太厉害,资源真多!
    回复

    使用道具 举报

    醉于山水 | 2022-4-13 12:33:45 | 显示全部楼层
    支持悟空源码,越来越好
    回复

    使用道具 举报

    毛当归搜 | 2022-6-1 05:45:59 | 显示全部楼层
    谢谢楼主发布的资源下载,帮助我不少
    回复

    使用道具 举报

    123457500 | 2023-10-4 10:22:36 | 显示全部楼层
    加油!悟空源码,继续努力!支持你!
    回复

    使用道具 举报

    有个胖子他姓杨 | 2024-5-18 08:18:15 | 显示全部楼层
    祝愿悟空源码越办越好!
    回复

    使用道具 举报

    粘瓜莱 | 2024-5-27 21:10:29 | 显示全部楼层
    5kym.cn这个站资源太全了
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则