可空类型
可空类型主要用于参数类型声明很函数返回值声明。
主要的两种形式如下:
1 2 3 4 5 6 |
|
从例子很容易理解,所指的就是通过 ?
的形式表明函数参数或者返回值的类型要么为指定类型,要么为 null
。
此方法也可用于接口函数的定义:
1 2 |
|
但有一个需要注意的地方:如果函数本身定义了参数类型并且没有默认值,即使是可空的,也不能省略,否则会触发错误。如下:
1 2 3 4 |
|
但是如果以上函数的参数定义为 ?Bar $bar = null
的形式,则第三种写法也是可行的。因为 = null
实际上相当于 ?
的超集,对于可空类型的参数,可以设定 null
为默认值。
list 的方括号简写
我们知道在 PHP5.4 之前只能通过 array()
来定义数组,5.4之后添加了 []
的简化写法(省略了5个字符还是很实在的)。
1 2 3 4 5 6 |
|
引申到另外一个问题上,如果我们要把数组的值赋值给不同的变量,可以通过 list
来实现:
1 |
|
是否也可以通过 []
的简写来实现呢?
1 |
|
以及下一个特性中会提到的 list 指定 key:
1 |
|
PHP7.1 实现了这个特性。但是要注意的是:出现在左值中的 []
并不是数组的简写,是 list()
的简写。
但是并不仅仅如此,新的 list()
的实现并不仅仅可以出现在左值中,也能在 foreach
循环中使用:
1 2 3 4 5 6 |
|
不过因为实现的问题,list()
和 []
不能相互嵌套使用
void 返回类型
PHP7.0 添加了指定函数返回类型的特性,但是返回类型却不能指定为 void
,7.1 的这个特性算是一个补充:
1 2 3 4 5 |
|
以下两种情况都可以通过验证:
1 2 3 4 5 6 7 8 |
|
定义返回类型为 void
的函数不能有返回值,即使返回 null
也不行:
<?php
function returns_one(): void {
return 1; // Fatal error: A void function must not return a valu
}
function returns_null(): void {
return null; // Fatal error: A void function must not return a value
}
此外 void
也只适用于返回类型,并不能用于参数类型声明,或者会触发错误:
1 2 3 4 |
|
类函数中对于返回类型的声明也不能被子类覆盖,否则会触发错误:
1 2 3 4 5 6 7 8 9 10 11 |
|
类常量属性设定
这个特性说起来比较简单,就是现在类中的常量支持使用 public
、private
和 protected
修饰了:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
此外,接口(interface)中的常量只能是 public
属性:
1 2 3 4 5 |
|
为了应对变化,反射类的实现也相应的丰富了一下,增加了 getReflectionConstant
和getReflectionConstants
两个方法用于获取常量的额外属性:
1 2 3 4 5 6 7 8 |
|
在以往的 try ... catch
语句中,每个 catch
只能设定一个条件判断:
1 2 3 4 5 6 7 8 9 10 |
|
新的实现中可以在一个 catch
中设置多个条件,相当于或的形式判断:
1 2 3 4 5 6 7 8 |
|
对于异常的处理简化了一些。
附:源 RFC 地址
Square bracket syntax for array destructuring assignment
Allow specifying keys in list()
Generalize support of negative string offsets