全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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
 }
}

五、类常量属性设定

这个特性说起来比较简单,就是现在类中的常量支持使用 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


# php7.1  # 新特性  # php7新特性  # 简述PHP7.4 新特性和废弃的功能  # php7新特性的理解和比较总结  # PHP5.5新特性之yield理解与用法实例分析  # php7函数  # 声明  # 返回值等新特性介绍  # PHP新特性之字节码缓存和内置服务器  # PHP新特性详解之命名空间、性状与生成器  # php 7新特性之类型申明详解  # Netbeans 8.2与PHP相关的新特性介绍  # PHP7 新特性详细介绍  # PHP7新特性foreach 修改示例介绍  # PHP 8新特性简介  # 可以通过  # 的是  # 多个  # 出现在  # 两种  # 返回值  # 以往  # 来实现  # 则会  # 不合法  # 有一个  # 默认值  # 适用于  # 有一定  # 也可  # 很容易  # 能在  # 要把  # 这也  # 要注意 


相关文章: 建站主机解析:虚拟主机配置与服务器选择指南  如何选择高效稳定的ISP建站解决方案?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  黑客如何通过漏洞一步步攻陷网站服务器?  如何通过cPanel快速搭建网站?  如何选择适合PHP云建站的开源框架?  如何在阿里云高效完成企业建站全流程?  建站与域名管理如何高效结合?  html制作网站的步骤有哪些,iapp如何添加网页?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  ,怎么在广州志愿者网站注册?  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何选择高效可靠的多用户建站源码资源?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  长沙做网站要多少钱,长沙国安网络怎么样?  详解jQuery停止动画——stop()方法的使用  建站之星安装后如何自定义网站颜色与字体?  如何安全更换建站之星模板并保留数据?  盐城做公司网站,江苏电子版退休证办理流程?  如何快速搭建高效简练网站?  网页设计网站制作软件,microsoft office哪个可以创建网页?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  宝塔面板如何快速创建新站点?  攀枝花网站建设,攀枝花营业执照网上怎么年审?  宝塔建站后网页无法访问如何解决?  制作销售网站教学视频,销售网站有哪些?  如何访问已购建站主机并解决登录问题?  如何通过.red域名打造高辨识度品牌网站?  制作网站怎么制作,*游戏网站怎么搭建?  建设网站制作价格,怎样建立自己的公司网站?  如何撰写建站申请书?关键要点有哪些?  定制建站是什么?如何实现个性化需求?  企业网站制作公司网页,推荐几家专业的天津网站制作公司?  营销式网站制作方案,销售哪个网站招聘效果最好?  设计网站制作公司有哪些,制作网页教程?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  定制建站方案优化指南:企业官网开发与建站费用解析  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何通过万网虚拟主机快速搭建网站?  如何用腾讯建站主机快速创建免费网站?  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  如何在阿里云虚拟主机上快速搭建个人网站?  建站之星会员如何解锁更多建站功能?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  网站按钮制作软件,如何实现网页中按钮的自动点击?  实惠建站价格推荐:2025年高性价比自助建站套餐解析  如何打造高效商业网站?建站目的决定转化率  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  常州企业网站制作公司,全国继续教育网怎么登录? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。