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 mysql数据库操作分页类
Jun 04 PHP
PHP 网页过期时间的控制代码
Jun 29 PHP
PHP用GD库生成高质量的缩略图片
Mar 09 PHP
PHP数据类型之布尔型的介绍
Apr 28 PHP
基于php设计模式中工厂模式详细介绍
May 15 PHP
zf框架的session会话周期及次数限制使用示例
Mar 13 PHP
PHP父类调用子类方法的代码例子
Apr 09 PHP
ThinkPHP3.1新特性之对页面压缩输出的支持
Jun 19 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
Sep 23 PHP
为你总结一些php信息函数
Oct 21 PHP
用php+ajax新建流程(请假、进货、出货等)
Jun 11 PHP
Thinkphp5框架ajax接口实现方法分析
Aug 28 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
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
服务器迁移php版本不同可能诱发的问题
2015/12/22 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
用php定义一个数组最简单的方法
2019/10/04 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
javascript引用对象的方法
2007/01/11 Javascript
window.parent调用父框架时 ie跟火狐不兼容问题
2009/07/30 Javascript
ExtJS 学习专题(一) 如何应用ExtJS(附实例)
2010/03/11 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
ajax如何实现页面局部跳转与结果返回
2015/08/24 Javascript
js操作数组函数实例小结
2015/12/10 Javascript
JavaScript实现复制内容到粘贴板代码
2016/03/31 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
[原创]JQuery 在表单提交之前修改 提交的值
2016/04/14 Javascript
JavaScript常用代码书写规范的超全面总结
2016/09/11 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
Angular1.x自定义指令实例详解
2017/03/01 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
基于require.js的使用(实例讲解)
2017/09/07 Javascript
基于Vuejs的搜索匹配功能实现方法
2018/03/03 Javascript
在Web关闭页面时发送Ajax请求的实现方法
2019/03/07 Javascript
jquery 回调操作实例分析【回调成功与回调失败的情况】
2019/09/27 jQuery
JS自定义滚动条效果
2020/03/13 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
Python列表生成式与生成器操作示例
2018/08/01 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
keras打印loss对权重的导数方式
2020/06/10 Python
python爬虫搭配起Bilibili唧唧的流程分析
2020/12/01 Python
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
西班牙在线光学:Visual-Click
2020/06/22 全球购物
幼儿教师自我鉴定
2013/11/02 职场文书
宾馆总经理岗位职责
2014/02/14 职场文书
艺术节主持词
2014/04/02 职场文书