PHP社区已经发布了PHP 7.1,这个版本带来了很多好消息和很多新功能。 本文摘录了几个最重要的更新。 您还可以通过 PHP RFC 查看完整的更新列表。
可空类型
PHP 7 添加了参数类型声明和函数返回值类型声明。 函数参数或返回值的类型要么是指定类型,要么为null。 示例如下:
<pre data-cke-widget-data="%7B%22lang%22%3A%22php%22%2C%22code%22%3A%22function%20sum(int%20%24a%2C%20int%20%24b)%3A%20%3Fint%5Cn%7B%5Cn%20%20%20%20return%20%24a%20%2B%20%24b%3B%5Cn%7D%22%2C%22classes%22%3Anull%7D" data-cke-widget-upcasted="1" data-cke-widget-keep-attr="0" data-widget="codeSnippet" class="hljs php" style=" box-sizing: border-box; ; ; ; ; ; ; ; ; ; ; ; ">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(null, null)); // NULLvar_dump(sum()); // throw ArgumentCountError exception
这意味着当指定的参数没有默认值时应该显示它们。
此外,在重载或实现可为 null 的类型时php删除空数组,不能使用它作为返回类型,但可以将其删除。 反之亦然!
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) = [1, 2, 3];
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]] = [[1, 2], [3, 4]];
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)
可迭代的伪类
PHP 7.1 引入了一个新的伪类,称为 iterable。
它可以用在参数或返回值类型中php删除空数组,它表示一个接受字段或实现 Traversable 接口的对象。 以下面的代码为例:
// PHP 5.6function dump(array $items){ var_dump($items);
}
dump([2, 3, 4]);
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([2, 3, 4]);
dump(new Collection());
array(3) {
[0]=>
int(2)
[1]=>
int(3)
[2]=>
int(4)
}
object(Collection)#2 (0) {}
返回类型为空
这是我最喜欢的新功能之一。 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()]);
}// ...
英文原文:
编译:开源中国