深入浅析PHP7.0新特征(五大新特征)


Posted in PHP onOctober 29, 2015

截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了。后续一些版本的迭代主要也就是修修bug,优化之类的。下面就来说话我们一直期待的php7.0五大新特征吧。

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

1. 运算符(NULL 合并运算符)

把这个放在第一个说是因为我觉得它很有用。用法:

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

它相当于:

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

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

$a ?: 1

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

深入浅析PHP7.0新特征(五大新特征)

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 了,最终的版本应该会很快到来。

以上所述是关于php7.0新特征的全部内容,希望本文介绍大家喜欢。

PHP 相关文章推荐
Breeze 文章管理系统 v1.0.0正式发布
Dec 14 PHP
PHP Zip压缩 在线对文件进行压缩的函数
May 26 PHP
PHP 删除一个目录及目录下的所有文件的函数代码
May 26 PHP
php array的学习笔记
May 16 PHP
Memcached常用命令以及使用说明详解
Jun 27 PHP
PHP判断变量是否为0的方法
Feb 08 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
实例详解PHP中html word 互转的方法
Jan 28 PHP
php封装的单文件(图片)上传类完整实例
Oct 18 PHP
thinkPHP框架实现生成条形码的方法示例
Jun 06 PHP
基于laravel缓冲cache的用法详解
Oct 23 PHP
PHP设计模式(八)装饰器模式Decorator实例详解【结构型】
May 02 PHP
适用于初学者的简易PHP文件上传类
Oct 29 #PHP
php实现网站文件批量压缩下载功能
Oct 28 #PHP
php简单日历函数
Oct 28 #PHP
php将数组存储为文本文件方法汇总
Oct 28 #PHP
php如何获取文件的扩展名
Oct 28 #PHP
php检查页面是否被百度收录
Oct 28 #PHP
PHP加密解密函数详解
Oct 28 #PHP
You might like
DOM XPATH获取img src值的query
2013/09/23 PHP
PHP单态模式简单用法示例
2016/11/16 PHP
搭建自己的PHP MVC框架详解
2017/08/16 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
彪哥1.1(智能表格)提供下载
2006/09/07 Javascript
ext for eclipse插件安装方法
2008/04/27 Javascript
jQuery 源码分析笔记(6) jQuery.data
2011/06/08 Javascript
Js日期选择自动填充到输入框(界面漂亮兼容火狐)
2013/08/02 Javascript
js 获取、清空input type=&quot;file&quot;的值(示例代码)
2013/12/24 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
JS 调用微信扫一扫功能
2016/12/22 Javascript
详解用vue.js和laravel实现微信授权登陆
2017/06/23 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
arcgis for js栅格图层叠加(Raster Layer)问题
2017/11/22 Javascript
帮你彻底搞懂JS中的prototype、__proto__与constructor(图解)
2019/08/23 Javascript
在Layui中实现开关按钮的效果实例
2019/09/29 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
python3生成随机数实例
2014/10/20 Python
python实现聚类算法原理
2018/02/12 Python
Python3中exp()函数用法分析
2019/02/19 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Ranorex通过Python将报告发送到邮箱的方法
2020/01/12 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
Chemist Warehouse官方海外旗舰店:澳洲第一连锁大药房
2017/08/25 全球购物
为有想象力的人提供的生活方式商店:Firebox
2018/06/04 全球购物
大型车展策划方案
2014/02/01 职场文书
2014党委书记四风问题对照检查材料思想汇报
2014/09/22 职场文书
保密工作整改情况汇报
2014/11/06 职场文书
运动会开幕词
2015/01/28 职场文书