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 相关文章推荐
PHP安装攻略:常见问题解答(一)
Oct 09 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
php算开始时间到过期时间的相隔的天数
Jan 12 PHP
php遍历数组的方法分享
Mar 22 PHP
PHP把MSSQL数据导入到MYSQL的方法
Dec 27 PHP
php调用淘宝开放API实现根据卖家昵称获取卖家店铺ID的方法
Jul 29 PHP
php根据日期或时间戳获取星座信息和生肖等信息
Oct 20 PHP
PHP在线书签系统分享
Jan 04 PHP
PHP读取CSV大文件导入数据库的实例
Jul 24 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
Jul 27 PHP
php获取微信共享收货地址的方法
Dec 21 PHP
php7 图形用户界面GUI 开发示例
Feb 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&amp;mysql(三)
2006/10/09 PHP
PHP统计当前在线用户数实例讲解
2015/10/21 PHP
CodeIgniter钩子用法实例详解
2016/01/20 PHP
Thinkphp框架 表单自动验证登录注册 ajax自动验证登录注册
2016/12/27 PHP
jQuery 隔行换色 支持键盘上下键,按Enter选定值
2009/08/02 Javascript
js弹出窗口之弹出层的小例子
2013/06/17 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
js禁止页面使用右键(简单示例代码)
2013/11/13 Javascript
理解Javascript的动态语言特性
2015/06/17 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JS集成fckeditor及判断内容是否为空的方法
2016/05/27 Javascript
AngularJS 指令详细介绍
2016/07/27 Javascript
原生javascript实现图片放大镜效果
2017/01/18 Javascript
4个顶级开源JavaScript图表库
2018/09/29 Javascript
详解Vue.directive 自定义指令
2019/03/27 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
Vue快速实现通用表单验证功能
2019/12/05 Javascript
jquery.validate自定义验证用法实例分析【成功提示与择要提示】
2020/06/06 jQuery
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
使用python将图片按标签分入不同文件夹的方法
2018/12/08 Python
详解pytorch中squeeze()和unsqueeze()函数介绍
2020/09/03 Python
Python的logging模块基本用法
2020/12/24 Python
Skyscanner阿联酋:全球领先的旅游搜索平台
2017/11/25 全球购物
KELLER SPORTS荷兰:在线订购最好的运动产品
2020/10/13 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
分布式数据库需要考虑哪些问题
2013/12/08 面试题
党委书记岗位职责
2013/11/24 职场文书
人力资源部副职的竞聘演讲稿
2014/01/07 职场文书
城市精细化管理实施方案
2014/03/04 职场文书
小学优秀辅导员事迹材料
2014/05/11 职场文书
python实现高效的遗传算法
2021/04/07 Python
MySQL分库分表详情
2021/09/25 MySQL
通过Python把学姐照片做成拼图游戏
2022/02/15 Python