從 RFC 看看 PHP 7.3 會有什麼新玩意兒

最近有個習慣是看 PHP 的 RFC,偶爾會看到一些有趣的新功能,也為了未來的系統升級做一下準備。

如果你對 PHP 的 RFC 有興趣,可以看看這裡

這篇文章中只介紹確定會在 PHP 7.3 中被引入的功能,對於正在提案中的、投票中的就暫時略過。


  1. 在函式呼叫時期允許參數末端的逗號(Allow a trailing comma in function calls )

以下操作目前是被允許的:

<?php

use Foo\Bar\{
    Foo,
    Bar,
};

$foo = [
    'foo',
    'bar',
];

以下操作目前是不被允許的,在此 RFC 通過後就可以使用:

<?php

unset(
    $a, 
    $b, 
    $c,
); 

然而目前以下操作在此 RFC 通過後,仍然不可以使用:

function bar($a, $b,) {
    //
}

foo(,);

foo('function', 'bar',,);

foo(, 'function', 'bar');
  1. JSON_THROW_ON_ERROR

目前而言 json_decode() 如果失敗,會 return null;而 json_encode() 如果失敗,會 return false。如果要瞭解具體是什麼失敗,則要呼叫 json_last_error()json_last_error_msg()

這個 RFC 提案加入一個 JsonException,它繼承 Exception,就像大部份的 PHP built-in 功能一樣,位於根命名空間下(\JsonException

它會拿來取代 json_last_error()json_last_error_msg() 的作用,但這兩個函式依照慣例仍然會在核心保留一段時間。

  1. 遷移至 PCRE2(PCRE2 Migration)

PHP 有許多功能依賴於 PCRE(尤其是在正則表達式的部份),但目前 PHP 是依賴於 pcre 8.x 版本,這個版本已經不再加入新功能,僅做 bug fix。

所以在下一代會把這項依賴升級為 PCRE2,目前推測應該不會對現有功能造成影響,但若要升級到 PHP 7.3 且應用程式有使用正則表達式者,應該做一下測試以確定沒有問題。

  1. list() 中使用參數傳遞( list() Reference Assignment)

通過此 RFC 後,可以使用下列的做法:

<?php

$array = [1, 2];
list($a, &$b) = $array;
[$a, &$b] = $array; // 這句的操作跟上一句的操作是等價的

var_dump($array);
// array(2) {
//  [0]=>
//  int(1)
//  [1]=>
//  &int(2)
//}

如果還是不太瞭解,下面的操作跟上面的例子是相同的(可執行於 PHP 7.1)

<?php

$array = [1, 2];

$a = $array[0];
$b =& $array[1];
  1. is_countable() 函式

如果建立了一個類別且有實作 Countable 介面,則它可以被 foreach 循環取值。(最容易理解的例子就是 Laravel 的 collect()

以往,我們可能要用 is_array($collect) || $collect instanceof Countable 來確定是否可以被 foreach 循環取值(如果你不確定傳進來的是 Countable Class 還是一個陣列)

在此 RFC 下,我們可以簡化成 is_countable() 這個函式。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由系统于 6年前 自动加精
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 2
leo

就想知道啥时候能支持 lambda

6年前 评论

@leo 現在有殘廢的 lambda,好像在 2008 年有人提過,但是通過的只有 Closure 這個 Feature。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!