PHP 7.0新增加的特性介绍


Posted in PHP onJune 08, 2017

?? 运算符(NULL 合并运算符) 把这个放在第一个说是因为我觉得它很有用。用法: $a = $_GET['a'] ?? 1;它相当于: <?PHP $a = isset($_GET['a']) ? $_GET['a'] : 1; 我们知道三元运算符是可以这样用的: $a ?: 1但是这是建立在 $a 已经定义了的前提上。

?? 运算符(NULL 合并运算符)

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

$a = $_GET['a'] ?? 1; 它相当于:

<?php $a = isset($_GET['a']) ? $_GET['a'] : 1; 我们知道三元运算符是可以这样用的:

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

1.函数返回值类型声明

官方文档提供的例子(注意 ... 的边长参数语法在 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?

标量类型声明

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 的致命错误。

1.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 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

其他的特性

其他的一些特性我就不一一介绍了,有兴趣可以查看官方文档: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 7.0新增加的特性介绍,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
3种平台下安装php4经验点滴
Oct 09 PHP
php调用mysql存储过程
Feb 14 PHP
php 向访客和爬虫显示不同的内容
Nov 09 PHP
PHP字符串处理的10个简单方法
Jun 30 PHP
关于PHP语言构造器介绍
Jul 08 PHP
php打开远程文件的方法和风险及解决方法
Nov 12 PHP
PHP判断网络文件是否存在的方法
Mar 12 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 PHP
php使用curl实现简单模拟提交表单功能
May 15 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
PHP单例模式实例分析【防继承,防克隆操作】
May 22 PHP
PHP使用PHPExcel实现批量上传到数据库的方法
Jun 08 #PHP
iis6手工创建网站后无法运行php脚本的解决方法
Jun 08 #PHP
PHP简单获取随机数的常用方法小结
Jun 07 #PHP
laravel 5.1下php artisan migrate的使用注意事项总结
Jun 07 #PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 #PHP
解决laravel 5.1报错:No supported encrypter found的办法
Jun 07 #PHP
PHP框架Laravel中实现supervisor执行异步进程的方法
Jun 07 #PHP
You might like
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
如何在Ubuntu下启动Apache的Rewrite功能
2013/07/05 PHP
php mysqli查询语句返回值类型实例分析
2016/06/29 PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
2018/12/18 PHP
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
jquery设置控件位置的方法
2013/08/21 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
javascript创建数组之联合数组的使用方法示例
2013/12/26 Javascript
node.js中的http.createClient方法使用说明
2014/12/15 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
canvas学习之API整理笔记(一)
2016/12/29 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
微信小程序之多文件下载的简单封装示例
2018/01/29 Javascript
js抽奖转盘实现方法分析
2020/05/16 Javascript
python使用socket进行简单网络连接的方法
2015/04/29 Python
python协程用法实例分析
2015/06/04 Python
python检查字符串是否是正确ISBN的方法
2015/07/11 Python
Python实现简单过滤文本段的方法
2017/05/24 Python
Python PyQt4实现QQ抽屉效果
2018/04/20 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
Python3 串口接收与发送16进制数据包的实例
2019/06/12 Python
如何用OpenCV -python3实现视频物体追踪
2019/12/04 Python
pycharm Tab键设置成4个空格的操作
2021/02/26 Python
纯CSS打造(无图像无js)的非常流行的讲话(语音)气泡效果
2012/12/28 HTML / CSS
日本运动品牌美津浓官方购物网站:MIZUNO SHOP
2016/08/21 全球购物
阿里健康官方海外旗舰店:阿里健康国际自营
2017/11/24 全球购物
校园网站的创业计划书范文
2013/12/30 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
团员年度个人总结
2015/02/26 职场文书
行政人事主管岗位职责
2015/04/11 职场文书
《夜莺的歌声》教学反思
2016/02/22 职场文书
农村房屋租赁合同(范本)
2019/07/23 职场文书
Vue和Flask通信的实现
2021/05/19 Vue.js