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 相关文章推荐
一个用于MySQL的PHP XML类
Oct 09 PHP
php中ob(Output Buffer 输出缓冲)函数使用方法
Jul 21 PHP
PHP simple_html_dom.php+正则 采集文章代码
Dec 24 PHP
php打造属于自己的MVC框架
Mar 07 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
在Windows系统下使用PHP生成Word文档的教程
Jul 03 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
php单链表实现代码分享
Jul 04 PHP
PHP检测数据类型的几种方法(总结)
Mar 04 PHP
使用PHP连接数据库_实现用户数据的增删改查的整体操作示例
Sep 01 PHP
PHP使用Redis长连接的方法详解
Feb 12 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数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
ThinkPHP3.1新特性之多数据库操作更加完善
2014/06/19 PHP
php进行支付宝开发中return_url和notify_url的区别分析
2014/12/22 PHP
php修改数组键名的方法示例
2017/04/15 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
用javascript来实现动画导航效果的代码
2007/12/16 Javascript
JS 的应用开发初探(mootools)
2009/12/19 Javascript
JavaScript栏目列表隐藏/显示简单实现
2013/04/03 Javascript
js判断IE浏览器版本过低示例代码
2013/11/22 Javascript
用js传递value默认值的示例代码
2014/09/11 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
包含中国城市的javascript对象实例
2015/08/03 Javascript
JS实现仿QQ面板的手风琴效果折叠菜单代码
2015/09/11 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
2015/10/23 Javascript
实例详解jQuery Mockjax 插件模拟 Ajax 请求
2016/01/12 Javascript
JavaScript实现计算圆周率到小数点后100位的方法示例
2018/05/08 Javascript
python发送伪造的arp请求
2014/01/09 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python利用QQ邮箱发送邮件的实现方法(分享)
2017/06/09 Python
python正则表达式面试题解答
2020/04/28 Python
用 Python 连接 MySQL 的几种方式详解
2018/04/04 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
利用Python pandas对Excel进行合并的方法示例
2020/11/04 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
个人应聘自我评价分享
2013/11/18 职场文书
勤奋学习演讲稿
2014/05/10 职场文书
房屋租赁协议书
2014/10/18 职场文书
自查自纠工作情况报告
2014/10/29 职场文书
公司放假通知怎么写
2015/04/15 职场文书
小学生暑假生活总结
2015/07/13 职场文书
原来闭幕词是这样写的呀!
2019/07/01 职场文书
SpringBoot使用AOP实现统计全局接口访问次数详解
2022/06/16 Java/Android