一、可空类型

可空类型主要用于参数类型声明和函数返回值声明。

主要的两种形式如下:

<?php
function answer(): ?int {
 return null; //ok
}

function answer(): ?int {
 return 42; // ok
}

function say(?string $msg) {
 if ($msg) {
 echo $msg;
 }
}

从例子很容易理解,所指的就是通过 ? 的形式表明函数参数或者返回值的类型要么为指定类型,要么为 null。

此方法也可用于接口函数的定义:

<?php
interface Fooable {
 function foo(?Fooable $f);
}

但有一个需要注意的地方:如果函数本身定义了参数类型并且没有默认值,即使是可空的,也不能省略,否则会触发错误。如下:

<?php
function foo_nullable(?Bar $bar) {}

foo_nullable(new Bar); // 可行
foo_nullable(null); // 可行
foo_nullable(); // 不可行

但是如果以上函数的参数定义为 ?Bar $bar = null 的形式,则第三种写法也是可行的。因为 = null 实际上相当于 ? 的超集,对于可空类型的参数,可以设定 null 为默认值。

二、list 的方括号简写

我们知道在 PHP5.4 之前只能通过 array() 来定义数组,5.4之后添加了 [] 的简化写法(省略了5个字符还是很实在的)。

<?php
// 5.4 之前
$array = array(1, 2, 3);
$array = array("a" => 1, "b" => 2, "c" => 3);

// 5.4 及之后
$array = [1, 2, 3];
$array = ["a" => 1, "b" => 2, "c" => 3];

引申到另外一个问题上,如果我们要把数组的值赋值给不同的变量,可以通过 list 来实现:

<?php
list($a, $b, $c) = $array;

是否也可以通过 [] 的简写来实现呢?

<?php
[$a, $b, $c] = $array;

以及下一个特性中会提到的 list 指定 key

<?php
["a" => $a, "b" => $b, "c" => $c] = $array;

PHP7.1 实现了这个特性。但是要注意的是:出现在左值中的 [] 并不是数组的简写,是 list() 的简写。

但是并不仅仅如此,新的 list() 的实现并不仅仅可以出现在左值中,也能在 foreach 循环中使用:

<?php
foreach ($points as ["x" => $x, "y" => $y]) {
 var_dump($x, $y);
}

不过因为实现的问题,list() 和 [] 不能相互嵌套使用:

<?php
// 不合法
list([$a, $b], [$c, $d]) = [[1, 2], [3, 4]];

// 不合法
[list($a, $b), list($c, $d)] = [[1, 2], [3, 4]];

// 合法
[[$a, $b], [$c, $d]] = [[1, 2], [3, 4]];

三、允许在 list 中指定 key

上文提到过,新的 list() 的实现中可以指定key:

<?php
$array = ["a" => 1, "b" => 2, "c" => 3];
["a" => $a, "b" => $b, "c" => $c] = $array;

这也就相当于:

<?php
$a = $array['a'];
$b = $array['b'];
$c = $array['c'];

和以往的区别在于以往的 list() 的实现相当于 key 只能是 0, 1, 2, 3 的数字形式并且不能调整顺序。执行以下语句:

<?php
list($a, $b) = [1 => '1', 2 => '2'];

会得到 PHP error: Undefined offset: 0... 的错误。

而新的实现则可以通过以下方式来调整赋值:

<?php
list(1 => $a, 2 => $b) = [1 => '1', 2 => '2'];

不同于数组的是,list 并不支持混合形式的 key,以下写法会触发解析错误:

<?php
// Parse error: syntax error, ...
list($unkeyed, "key" => $keyed) = $array;

更复杂的情况,list 也支持复合形式的解析:

<?php
$points = [
 ["x" => 1, "y" => 2],
 ["x" => 2, "y" => 1]
];

list(list("x" => $x1, "y" => $y1), list("x" => $x2, "y" => $y2)) = $points;

$points = [
 "first" => [1, 2],
 "second" => [2, 1]
];

list("first" => list($x1, $y1), "second" => list($x2, $y2)) = $points;

以及循环中使用:

<?php
$points = [
 ["x" => 1, "y" => 2],
 ["x" => 2, "y" => 1]
];

foreach ($points as list("x" => $x, "y" => $y)) {
 echo "Point at ($x, $y)", PHP_EOL;
}

四、void 返回类型

PHP7.0 添加了指定函数返回类型的特性,但是返回类型却不能指定为 void,7.1 的这个特性算是一个补充:

<?php
function should_return_nothing(): void {
 return 1; // Fatal error: A void function must not return a value
}

以下两种情况都可以通过验证:

<?php
function lacks_return(): void {
 // valid
}

function returns_nothing(): void {
 return; // valid
}

定义返回类型为 void 的函数不能有返回值,即使返回 null 也不行:

<?php
function returns_one(): void {
 return 1; // Fatal error: A void function must not return a value
}

function returns_null(): void {
 return null; // Fatal error: A void function must not return a value
}

此外 void 也只适用于返回类型,并不能用于参数类型声明,或者会触发错误:

<?php
function foobar(void $foo) { // Fatal error: void cannot be used as a parameter type
}

类函数中对于返回类型的声明也不能被子类覆盖,否则会触发错误:

<?php
class Foo
{
 public function bar(): void {
 }
}

class Foobar extends Foo
{
 public function bar(): array { // Fatal error: Declaration of Foobar::bar() must be compatible with Foo::bar(): void
 }
}

五、类常量属性设定

这个特性说起来比较简单,就是现在类中的常量支持使用 publicprivate protected 修饰了:

<?php
class Token {
 // 常量默认为 public
 const PUBLIC_CONST = 0;

 // 可以自定义常量的可见范围
 private const PRIVATE_CONST = 0;
 protected const PROTECTED_CONST = 0;
 public const PUBLIC_CONST_TWO = 0;

 // 多个常量同时声明只能有一个属性
 private const FOO = 1, BAR = 2;
}

此外,接口(interface)中的常量只能是 public 属性:

<?php
interface ICache {
 public const PUBLIC = 0;
 const IMPLICIT_PUBLIC = 1;
}

为了应对变化,反射类的实现也相应的丰富了一下,增加了 getReflectionConstant getReflectionConstants 两个方法用于获取常量的额外属性:

<?php
class testClass {
 const TEST_CONST = 'test';
}

$obj = new ReflectionClass( "testClass" );
$const = $obj->getReflectionConstant( "TEST_CONST" );
$consts = $obj->getReflectionConstants();

六、多条件 catch

在以往的 try ... catch 语句中,每个 catch 只能设定一个条件判断:

<?php
try {
 // Some code...
} catch (ExceptionType1 $e) {
 // 处理 ExceptionType1
} catch (ExceptionType2 $e) {
 // 处理 ExceptionType2
} catch (\Exception $e) {
 // ...
}

新的实现中可以在一个 catch 中设置多个条件,相当于或的形式判断:

<?php
try {
 // Some code...
} catch (ExceptionType1 | ExceptionType2 $e) {
 // 对于 ExceptionType1 和 ExceptionType2 的处理
} catch (\Exception $e) {
 // ...
}

对于异常的处理简化了一些。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家学习或者使用PHP7.1能有一定的帮助,如果有疑问大家可以留言交流。

附:源 RFC 地址

Nullable Types
Square bracket syntax for array destructuring assignment
Allow specifying keys in list()
Generalize support of negative string offsets
Void Return Type
Class constant visibility modifiers
Multi catch

PHP 7.1新特性的汇总介绍的更多相关文章

  1. React18新增特性介绍

    react历次版本迭代主要想解决的是两类导致网页卡顿的问题,分别是cpu密集型任务和io密集型任务导致的卡顿问题,react18新增特性就是为了解决上述问题

  2. JavaScript高级程序设计(第3版)学习笔记13 ECMAScript5新特性

    通常而言,JavaScript由ECMAScript核心、BOM和DOM三部分构成,前面的文章将ECMAScript核心部分粗略的过了一篇

  3. Swoole 1.10.0新版本发布,增加了多项新特性

    最近Swoole 1.10.0版本发布了,增加多项新特性,所以下面这篇文章主要给大家介绍了关于Swoole 1.10.0版本中新特性的相关资料,分享出来供大家参考学习,需要的朋友可以参考下

  4. IOS11新特性与兼容适配

    iOS 11正式发布了,下面整理了一些该版本下的特点还有如何进行兼容适配工作需要做的事情,希望能够给你提供到帮助。

  5. PHP7新特性之抽象语法树(AST)带来的变化详解

    这篇文章主要介绍了PHP7新特性之抽象语法树(AST)带来的变化,结合实例形式分析了PHP7抽象语法树的相关概念、功能、特性、使用方法及相关注意事项,需要的朋友可以参考下

  6. 浅谈react 16.8版本新特性以及对react开发的影响

    本文主要介绍了react 16.8版本新特性以及对react开发的影响,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  7. Android Studio 4.0新特性及升级异常问题的解决方案

    这篇文章主要介绍了Android Studio 4.0新特性及升级异常的相关问题,本文给大家分享解决方案,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  8. jQuery 3.0十大新特性最终版发布

    jQuery 3.0在日前发布了最终的全新版本。这篇文章主要介绍了jQuery 3.0十大新特性最终版发布的相关资料,需要的朋友可以参考下

  9. Node.js v8.0.0正式发布!看看带来了哪些主要新特性

    Node.js v8.0.0 已正式发布。v8.0.0 是下一个主要的版本,带来了一系列重大的变化和新功能,内容十分多!下面这篇文章主要带着大家一起看看Node.js v8.0.0带来了哪些主要新特性,需要的朋友可以参考借鉴,下面来一起看看吧。

  10. PHP 7.1新特性的汇总介绍

    大家都知道PHP 7.1 release版本发布在即,所以这篇文章就给大家整理一下7.1中的一些新特性以供了解。所有内容均选自官方 RFC 文档。有需要的朋友们可以参考借鉴,下面来跟着小编一起学习学习吧。

随机推荐

  1. PHP个人网站架设连环讲(一)

    先下一个OmnihttpdProffesinalV2.06,装上就有PHP4beta3可以用了。PHP4给我们带来一个简单的方法,就是使用SESSION(会话)级变量。但是如果不是PHP4又该怎么办?我们可以假设某人在15分钟以内对你的网页的请求都不属于一个新的人次,这样你可以做个计数的过程存在INC里,在每一个页面引用,访客第一次进入时将访问时间送到cookie里。以后每个页面被访问时都检查cookie上次访问时间值。

  2. PHP函数学习之PHP函数点评

    PHP函数使用说明,应用举例,精简点评,希望对您学习php有所帮助

  3. ecshop2.7.3 在php5.4下的各种错误问题处理

    将方法内的函数,分拆为2个部分。这个和gd库没有一点关系,是ecshop程序的问题。会出现这种问题,不外乎就是当前会员的session或者程序对cookie的处理存在漏洞。进过本地测试,includes\modules\integrates\ecshop.php这个整合自身会员的类中没有重写integrate.php中的check_cookie()方法导致,验证cookie时返回的username为空,丢失了登录状态,在ecshop.php中重写了此方法就可以了。把他加到ecshop.php的最后面去就可

  4. NT IIS下用ODBC连接数据库

    $connection=intodbc_connect建立数据库连接,$query_string="查询记录的条件"如:$query_string="select*fromtable"用$cur=intodbc_exec检索数据库,将记录集放入$cur变量中。再用while{$var1=odbc_result;$var2=odbc_result;...}读取odbc_exec()返回的数据集$cur。最后是odbc_close关闭数据库的连接。odbc_result()函数是取当前记录的指定字段值。

  5. PHP使用JpGraph绘制折线图操作示例【附源码下载】

    这篇文章主要介绍了PHP使用JpGraph绘制折线图操作,结合实例形式分析了php使用JpGraph的相关操作技巧与注意事项,并附带源码供读者下载参考,需要的朋友可以参考下

  6. zen_cart实现支付前生成订单的方法

    这篇文章主要介绍了zen_cart实现支付前生成订单的方法,结合实例形式详细分析了zen_cart支付前生成订单的具体步骤与相关实现技巧,需要的朋友可以参考下

  7. Thinkphp5框架实现获取数据库数据到视图的方法

    这篇文章主要介绍了Thinkphp5框架实现获取数据库数据到视图的方法,涉及thinkPHP5数据库配置、读取、模型操作及视图调用相关操作技巧,需要的朋友可以参考下

  8. PHP+jquery+CSS制作头像登录窗(仿QQ登陆)

    本篇文章介绍了PHP结合jQ和CSS制作头像登录窗(仿QQ登陆),实现了类似QQ的登陆界面,很有参考价值,有需要的朋友可以了解一下。

  9. 基于win2003虚拟机中apache服务器的访问

    下面小编就为大家带来一篇基于win2003虚拟机中apache服务器的访问。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  10. Yii2中组件的注册与创建方法

    这篇文章主要介绍了Yii2之组件的注册与创建的实现方法,非常不错,具有参考借鉴价值,需要的朋友可以参考下

返回
顶部