令人期待的PHP7.4

令人期待的PHP7.4

大家好,又见面了,我是全栈君。

点击上方“码农编程进阶笔记”,选择“置顶或者星标

优质文章第一时间送达!

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112028.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 智能视频识别技术的发展现状「建议收藏」

    智能视频识别技术的发展现状「建议收藏」一、智能视频分析技术应用现状  作为强化视频监控系统应用的一门主要技术——视频智能分析技术,近几年一直得到业界的广泛的关注,其通过对视频内容的分析,将客户所关注的目标从监控背景中分离出来,按照目标的移动方向、速度、时间等参数和某些行为特征进行关联,从而达到主动监控防御的目的。按说这一技术的大规模推广应用对于提高当前治安监控系统的利用效率将起到很大的作用,但实际上却没有得到有效的推广,所谓“叫好不叫座”。笔者认为,造成这一现象的主要原因有以下几个方面:【您可以是大型系统集成商、可以是相关贸易的经销商.

    2022年4月30日
    75
  • 辛格尔顿

    辛格尔顿

    2022年1月1日
    39
  • t460 拆解_转一个详尽、全面的的X201拆机 – ThinkPad系统与软件技术|应用技巧|软件分享区 – 鸿利在线|北京ibm水货|IBM水货|Thinkpad笔记本|Thinkpad全球购|…

    t460 拆解_转一个详尽、全面的的X201拆机 – ThinkPad系统与软件技术|应用技巧|软件分享区 – 鸿利在线|北京ibm水货|IBM水货|Thinkpad笔记本|Thinkpad全球购|…占楼············下载(30.5KB)2010-6-123:42下载(20.97KB)2010-6-123:42ThinkPadX201的防水键盘,其实很多商务机都具备防水键盘,并不是说底部没有排水口的笔记本其键盘就不防水,是否防水取决于键盘导电薄膜边缘是否被密封。X201的键盘侧面有漏口,严格来说这不仅是防水键盘,而是进一步的防泼溅键盘。下载(23.51KB)2010…

    2022年6月27日
    63
  • DDR2 ODT_ddr vtt电压

    DDR2 ODT_ddr vtt电压

    经常有人会说支持DDR2的主板存在偷工减料的现象。事实上这是由于DDR2内存中使用了一项新的ODT技术,它可以在提高内存信号稳定性的基础上节省不少电器元件(个人想法:ODT会增加功耗的阿)。主板终结是一种最为常见的终结主板内干扰信号的方法。在每一条信号传输路径的末端,都会安置一个终结电阻,它具备一定的阻值可以吸收反射回来的电子。但是目前DDR2内存的工作频率太高了,这种主板终结的方法并不能有效的阻止干扰信号。若硬要采用主板终结的方法得到纯净的DDR2时钟信号会花费巨额的制造成本。

    2022年9月9日
    0
  • QT之Android下获取手机传感器数据学习笔记

    QT之Android下获取手机传感器数据学习笔记QT+=coreguisensorspositioning其中sensors是获取手机上传感器数据的组件,positioning是获取位置信息的组件1、获取陀螺仪传感器数据#include&lt;QGyroscope&gt;QGyroscope*gyroscope;QGyroscopeReading*reader;gyroscope=newQGyro…

    2022年7月13日
    14
  • java中 数组声明,java数组声明格式

    java中 数组声明,java数组声明格式java声明动态数组,java对象数组详解,java中声明数组,java数组声明格式Java中数组的声明一维数组的声明:在Java中,数组是独立的对象,有自身的方法,不是变量的集合。数组的声明:类型标识符数组名[]或者类型标识符[]……一维数组一维数组可以存放上千万个数据,并且这些数据的类型是完全相同的,使用java数组,必须经过两个步骤,声明数组和分…

    2022年6月2日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号