专栏名称: OSC开源社区
OSChina 开源中国 官方微信账号
目录
相关文章推荐
51CTO官微  ·  发布会上特斯拉Optimus竟是人扮演的?时 ... ·  2 天前  
程序员小灰  ·  强烈建议尽快搞个软考证!(重大利好) ·  1 周前  
程序员的那些事  ·  好家伙,尤雨溪创办公司啦!已融资3200万! ·  1 周前  
51好读  ›  专栏  ›  OSC开源社区

PHP 7.1 中有哪些重大的更新?

OSC开源社区  · 公众号  · 程序员  · 2016-12-12 08:46

正文



PHP 社区发布了 PHP 7.1 ,这次发布带来了很多好消息以及很多新功能。本文摘取了几个最重要的更新,你也可以通过PHP RFC查看完整更新列表。


可空类型


PHP 7添加了参数类型声明和函数返回值类型声明,函数参数或者返回值的类型要么为指定类型要么为null。举例如下:

function sum(int $a, int $b): ?int{
    return $a + $b;
}


上述函数可以返回一个整数或一个空值,所以如果函数的逻辑中有错误,将不会再返回一个空类型来报错。你也可以验证一下。

function sum(?int $a, ?int $b): ?int{
    if ($a == null || $b == null) {        return null;
    }    return $a + $b;
}


要注意的是:调用没有参数的函数将抛出异常!

var_dump(sum(nullnull)); // NULLvar_dump(sum()); // throw ArgumentCountError exception


这意味着,当他们没有默认值时,应该显示指定参数。


还有就是,在重载或实现方法时不能把可空类型作为返回类型,但你可以删除它。反之亦然!

interface Fooable {
    function foo(): ?Fooable;}interface StrictFooable extends Fooable {
    function foo(): Fooable// valid}interface Fooable {    function foo(): Fooable;}interface LooseFooable extends Fooable {
    function foo(): ?Fooable// invalid}


解构阵列


当我们解构阵列是通常会这样做:

list($a, $b, $c) = [123];
var_dump($a, $b, $c); // int(1) int(2) int(3)


但这是错的,因为我们不能指定键来提取和尝试使用索引键的功能

list($a, $b, $c) = ["a" => 1"b" => 2"c" => 3];
var_dump($a, $b, $c); // NULL NULL NULL


RFC提供了更多的控制阵列的解构。上面的代码可以改为:

list("a" => $a, "b" => $b, "c" => $c) = ["a" => 1"b" => 2"c" => 3];
var_dump($a, $b, $c); // int(1) int(2) int(3)


上面的例子可以写成:

["a" => $a, "b" => $b, "c" => $c] = ["a" => 1"b" => 2"c" => 3];
var_dump($a, $b, $c); // int(1) int(2) int(3)


很酷对不对?它还适用于多维数组:

[[$a, $b], [$c, $d]] = [[12], [34]];
var_dump($a, $b, $c, $d); // int(1) int(2) int(3) int(4)[["b" => $b], ["c" => $c]] = [["a" => 1, "b" => 2], ["c" => 3, "d" => 4]];var_dump($b, $c); // int(2) int(3)


Iterable 伪类


PHP 7.1 新引入了一个被称为 iterable  的伪类。

它可以被用在参数或者返回值类型中,它代表接受数组或者实现了 Traversable 接口的对象。以下面的代码为例:

// PHP 5.6function dump(array $items){    var_dump($items);
}

dump([234]);
dump(new Collection());
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(4)
}

Catchable fatal error: Argument 1 passed to dump() must be of the type array, object given...


但在这种情况下,函数不会接受一个价值,将抛出一个错误。这一新的变化,让你使用迭代来描述而不是手动一个价值主张。

// PHP 7.1function dump(iterable $items){    var_dump($items);
}

dump([234]);
dump(new Collection());
array(3) {
  [0]=>
  int(2)
  [1]=>
  int(3)
  [2]=>
  int(4)
}
object(Collection)#2 (0) {}


void返回类型


这是我最喜欢的新功能之一。PHP 7添加了指定函数返回类型的特性,一个新的返回值类型 void 被引入。试图去获取一个void 方法的返回值时,将被迫返回null!并且不会产生任何警告。

function dump($object): void{
    var_dump($object);
}


返回类型声明为 void 类型的方法要么干脆省去 return 语句,要么添加一个空的函数(return;)。


类常量的可见性


虽然这是个很小的变化,但是加强了面向对象的封装,现在起支持设置类常量的可见性:

class Post{
    protected const PUBLISHED = 1;    protected const DRAFT = 2;    protected const TRASHED = 3;    // ...}


捕获多个异常类型


在以往的try... catch 语句中,每个catch 只能设定一个条件判断,新的版本可以在一个 catch 中设置多个条件,从而减少了需要复制的代码。 Java 等其他语言同样具备这种能力。以下面的代码为例:

// ...try {    $user->payMonth($month);catch (UserSuspendedException $ex) {
    DB::rollBack();    return redirect()
            ->back()
            ->withInput()
            ->withErrors([$ex->getMessage()]);
} catch (PaidMonthException $e) {
    DB::rollBack();    return redirect()
            ->back()
            ->withInput()
            ->withErrors([$ex->getMessage()]);
}// ...


英文原文:https://www.sitepoint.com/whats-new-and-exciting-in-php-7-1/

编译:开源中国




推荐阅读

2017 年热门编程语言排行榜,你的语言上榜没?

你应该知道的 9 款流行 Web 框架及其优缺点

十个主题,最全的优秀 TensorFlow 相关资源列表

盘点重量级的国产开源项目,你用过哪款?

四个库,让你在 Android 中启用 Java 8 功能

点击“阅读原文”查看更多精彩内容