PHP 7的一些引人注目的新特性简单介绍


Posted in PHP onNovember 08, 2015

1. ?? 运算符(NULL 合并运算符)
把这个放在第一个说是因为我觉得它很有用。用法:

$a = $_GET['a'] ?? 1;

它相当于:

<?php
$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

2. 函数返回值类型声明
官方文档提供的例子(注意 ... 的边长参数语法在 PHP 5.6 以上的版本中才有):

<?php
function arraysSum(array ...$arrays): array
{
  return array_map(function(array $array): int {
    return array_sum($array);
  }, $arrays);
}
print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。

这种声明的写法有些类似于 swift:

func sayHello(personName: String) -> String {
  let greeting = "Hello, " + personName + "!"
  return greeting
}

这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。

不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。

使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。

强制模式:

<?php
function foo($a) : int
{
  return $a;
}
foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

<?php
declare(strict_types=1);
function foo($a) : int
{
  return $a;
}
foo(1.0);
# PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6

在声明之后,就会触发致命错误。

是不是有点类似与 js 的 strict mode?

3. 标量类型声明
PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

官方示例:

<?php
// Coercive mode
function sumOfInts(int ...$ints)
{
  return array_sum($ints);
}
var_dump(sumOfInts(2, '3', 4.1));

需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

4. use 批量声明
PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:

<?php
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。

需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

5. 其他的特性
其他的一些特性我就不一一介绍了,有兴趣可以查看官方文档:http://php.net/manual/en/migration70.new-features.php

简要说几个:

PHP 5.3 开始有了匿名函数,现在又有了匿名类了;
define 现在可以定义常量数组;
闭包( Closure)增加了一个 call 方法;
生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from 的新语法进入一个另外一个生成器中(生成器委托)。
生成器的两个新特性(return 和 yield from)可以组合。具体的表象大家可以自行测试。PHP 7 现在已经到 RC5 了,最终的版本应该会很快到来。

PHP 相关文章推荐
php基础知识:类与对象(1)
Dec 13 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
May 26 PHP
过滤掉PHP数组中的重复值的实现代码
Jul 17 PHP
ThinkPHP 防止表单重复提交的方法
Aug 08 PHP
PHP分页效率终结版(推荐)
Jul 01 PHP
php代码检查代理ip的有效性
Aug 19 PHP
php fseek函数读取大文件两种方法
Oct 12 PHP
PHP使用curl函数发送Post请求的注意事项
Nov 26 PHP
Yii2压缩PHP中模板代码的输出问题
Aug 28 PHP
PHP Laravel中的Trait使用方法
Jan 20 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
Feb 21 PHP
php实现mysql数据库连接操作及用户管理
Nov 08 #PHP
php实现处理输入转义字符的代码
Nov 08 #PHP
修复ShopNC使用QQ 互联时提示100010 错误
Nov 08 #PHP
详解PHP数组赋值方法
Nov 07 #PHP
php实现点击可刷新验证码
Nov 07 #PHP
PHP中SSO Cookie登录分析和实现
Nov 06 #PHP
使用PHP similar text计算两个字符串相似度
Nov 06 #PHP
You might like
如何在PHP中使用Oracle数据库(3)
2006/10/09 PHP
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
php微信开发之批量生成带参数的二维码
2016/06/26 PHP
laravel实现于语言包的完美切换方法
2019/09/29 PHP
Jquery Ajax学习实例3 向WebService发出请求,调用方法返回数据
2010/03/16 Javascript
JavaScript 用cloneNode方法克隆节点的代码
2012/10/15 Javascript
JS 实现BASE64_ENCODE和BASE64_DECODE(实例代码)
2013/11/13 Javascript
nodeType属性返回被选节点的节点类型介绍
2013/11/22 Javascript
[将免费进行到底]在Amazon的一年免费服务器上安装Node.JS, NPM和OurJS博客
2014/08/18 Javascript
使用jQuery仿苹果官网焦点图特效
2014/12/23 Javascript
js实现遍历含有input的table实例
2015/12/07 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
JavaScript实现经典排序算法之插入排序
2016/12/28 Javascript
JavaScript cookie详解及简单实例应用
2016/12/31 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
NodeJS如何实现同步的方法示例
2018/08/24 NodeJs
微信小程序实现预览图片功能
2020/10/22 Javascript
用VueJS写一个Chrome浏览器插件的实现方法
2019/02/27 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
Python中使用PyHook监听鼠标和键盘事件实例
2014/07/18 Python
python中日期和时间格式化输出的方法小结
2015/03/19 Python
python实现简单socket通信的方法
2016/04/19 Python
Python给图像添加噪声具体操作
2019/03/03 Python
Django 实现admin后台显示图片缩略图的例子
2019/07/28 Python
Python grpc超时机制代码示例
2020/09/14 Python
Pycharm安装Qt Design快捷工具的详细教程
2020/11/18 Python
FitFlop美国官网:英国符合人体工学的鞋类品牌
2018/10/05 全球购物
万宝龙英国官网:Montblanc手表、书写工具、皮革和珠宝
2018/10/16 全球购物
志愿者活动总结范文
2014/04/26 职场文书
商务经理岗位职责
2014/08/03 职场文书
2016年幼儿园庆六一开幕词
2016/03/04 职场文书
如何通过cmd 连接阿里云服务器
2022/04/18 Servers
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python