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 和 XML: 使用expat函数(一)
Oct 09 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
yii数据库的查询方法
Dec 28 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
Laravel搭建后台登录系统步骤详解
Jul 26 PHP
php is_executable判断给定文件名是否可执行实例
Sep 26 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
Dec 25 PHP
PHP实现文字写入图片功能
Feb 18 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
php实例化一个类的具体方法
Sep 19 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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实现MVC开发得最简单的方法――模型
2007/04/10 PHP
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
各种快递查询--Api接口
2016/04/26 PHP
javascript 学习笔记(一)DOM基本操作
2011/04/08 Javascript
node.js中的buffer.Buffer.byteLength方法使用说明
2014/12/10 Javascript
跟我学习javascript的垃圾回收机制与内存管理
2015/11/23 Javascript
深入理解jquery中的事件与动画
2016/05/24 Javascript
JS实现iframe自适应高度的方法(兼容IE与FireFox)
2016/06/24 Javascript
使用socket.io实现简单聊天室案例
2018/01/02 Javascript
CentOS环境中MySQL修改root密码方法
2018/01/07 Javascript
对angularJs中2种自定义服务的实例讲解
2018/09/30 Javascript
JavaScript设计模式之享元模式实例详解
2019/01/17 Javascript
新手快速入门JavaScript装饰者模式与AOP
2019/06/24 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
[01:00] DOTA2英雄背景故事第五期之重力引力法则谜团
2020/07/16 DOTA
介绍Python中的一些高级编程技巧
2015/04/02 Python
Mac中升级Python2.7到Python3.5步骤详解
2017/04/27 Python
Python编程实现两个文件夹里文件的对比功能示例【包含内容的对比】
2017/06/20 Python
对python sklearn one-hot编码详解
2018/07/10 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
对Tensorflow中tensorboard日志的生成与显示详解
2020/02/04 Python
Python ATM功能实现代码实例
2020/03/19 Python
Cole Haan官方网站:美国时尚潮流品牌
2017/12/06 全球购物
美国现代家具购物网站:LexMod
2019/01/09 全球购物
TripAdvisor日本:全球领先的旅游网站
2019/02/14 全球购物
酒店中秋节活动方案
2014/01/31 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
面试必备的求职信
2014/05/25 职场文书
2014年司法局工作总结
2014/12/11 职场文书
义卖募捐活动总结
2015/05/09 职场文书
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang