PHP 7.1 新特性一览

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

主要的两种形式如下:
<?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
    }
}

类常量属性设定

这个特性说起来比较简单,就是现在类中的常量支持使用 public、private 和 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) {
    // ...
}

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

稿源:七星互联www3.qixoo.com

时间: 2024-10-11 05:33:09

PHP 7.1 新特性一览的相关文章

HTML5和CSS3新特性一览

HTML5 1.HTML5 新元素 HTML5提供了新的元素来创建更好的页面结构: 标签 描述 <article> 定义页面独立的内容区域. <aside> 定义页面的侧边栏内容. <bdi> 允许您设置一段文本,使其脱离其父元素的文本方向设置. <command> 定义命令按钮,比如单选按钮.复选框或按钮 <details> 用于描述文档或文档某个部分的细节 <dialog> 定义对话框,比如提示框 <summary>

Spring 4支持的Java 8新特性一览

有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览Spring 4.0和4.1已经支持的Java 8新特性. Spring 4支持Java 6.7和8 Java 8编译器编译过的代码生成的.class文件需要在Java 8或以上的Java虚拟机上运行.由于Spring对反射机制和ASM.CGLIB等字节码操作函数库的重度使用,必须确保这些函数库能理解

ES6、ES7、ES8、ES9、ES10新特性一览

ES全称ECMAScript,ECMAScript是ECMA制定的标准化脚本语言.目前JavaScript使用的ECMAScript版本为ECMA-417.关于ECMA的最新资讯可以浏览 ECMA news查看. ECMA规范最终由TC39敲定.TC39由包括浏览器厂商在内的各方组成,他们开会推动JavaScript提案沿着一条严格的发展道路前进. 从提案到入选ECMA规范主要有以下几个阶段: Stage 0: strawman——最初想法的提交. Stage 1: proposal(提案)——

Java12可用新特性一览,了解一下没有错

你有一个思想,我有一个思想,我们交换后,一个人就有两个思想 If you can NOT explain it simply, you do NOT understand it well enough 现陆续将Demo代码和技术文章整理在一起 Github实践精选,本文同样收录在此,方便大家阅读查看,觉得不错,还请Star?? 日常工作对集合操作真的太频繁了,前端时间就写过一篇关于Java 12 集合的文章 Java12 Collectors.teeing 的使用详解 , 有朋友留言说这个功能比

基于Ubuntu和基于Debian的Linux Mint 20新特性一览

导读 Linux Mint 20 将基于 Ubuntu 20.04 LTS,同时,其 LMDE(Linux Mint Debian Edition,Debian 版本)4 也将到来,LMDE 版本基于 Debian GNU/Linux,提供滚动发布,而不是像常规的 Linux Mint 基于 Ubuntu. 日前 Linux Mint 官方博客释出了关于 Linux Mint 20 与 LMDE 4 的新特性信息. LMDE 4 LMDE 4 将首先发布,基于改进的 Debian 10 软件包,

前端神器 Firebug 2.0 新特性一览

如果你从事Web前端方面的开发工作,那么对Firebug一定不会陌生,这是Firefox浏览器的一款插件,集HTML查看和编辑.Javascript控制台.网络状况监视器于一体,给Web开发者带来了极大的便利,堪称Web前端开发神器. 最新版本Firebug 2.0即将发布,下面就来看看这个大版本中有哪些改进. 1.  基于新的Firefox调试引擎(JSD2) 2.  新的UI,以匹配Firefox 29版本中引入的Australis主题 3.  Script面板支持语法高亮 4.  允许检查

不只是Canvas和拖放——HTML5新特性一览

一.增加结构语义化的标签 section articel aside header hgroup footer nav figure command progress time ruby rt rp mark wbr ... 二.增加的表单类型 inputy元素增加了以下类型 email url number range Date pickers search color 全新增加的表单元素标签 datalist keygen output HTML5还增加了一些form和input的属性,详见

Atitit.mysql&#160;5.0&#160;5.5&#160;&#160;5.6&#160;5.7&#160;&#160;新特性&#160;新功能

Atitit.mysql 5.0 5.5  5.6 5.7  新特性 新功能 1. MySQL  5.6    5 大新特性1 1.1. 优化器的改进1 1.2. InnoDB 改进1 1.3. 使用 memcached API 直接访问 NoSQL2 1.4. 更好的复制2 1.5. Performance Schema2 2. MySQL 5.7.62 2.1. 内建中文全文索引2 2.2. 多主复制2 2.3. other2 3. 参考2 1. MySQL  5.6    5 大新特性 M

atitit.Windows Server 2003 2008 2012系统的新特性 attilax 总结

atitit.Windows Server 2003  2008  2012系统的新特性 attilax 总结 1. Windows Server 2008 新特性也可以归纳为4个方面. 1 2. 相比Windows Server 08,R2 2 3. win 2012  新特性 2 4. 参考 6 1. Windows Server 2008 新特性也可以归纳为4个方面. 即将发布的Windows Server 2008是企业级的应用平台,可以为CRM等企业级应用提供更好更强的支撑,其新特性也