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.ini 中文版
Oct 28 PHP
PHP文本操作类
Nov 25 PHP
php防攻击代码升级版
Dec 29 PHP
zend framework配置操作数据库实例分析
Dec 06 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
Feb 24 PHP
PHP+jQuery 注册模块的改进(一):验证码存入SESSION
Oct 14 PHP
PHP之sprintf函数用法详解
Nov 12 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
Mar 05 PHP
Zend Framework教程之Autoloading用法详解
Mar 08 PHP
php防止sql注入的方法详解
Feb 20 PHP
详解将数据从Laravel传送到vue的四种方式
Oct 16 PHP
PHP设计模式之 策略模式Strategy详解【对象行为型】
May 01 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
德生PL550的电路分析
2021/03/02 无线电
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
又十个超级有用的PHP代码片段
2015/09/24 PHP
PHP的几个常用加密函数
2016/02/03 PHP
JQuery实现表格中相同单元格合并示例代码
2013/06/26 Javascript
使用js简单实现了tree树菜单
2013/11/20 Javascript
js实现仿阿里巴巴城市选择框效果实例
2015/06/24 Javascript
js滑动提示效果代码分享
2016/03/10 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
详解Vue路由钩子及应用场景(小结)
2017/11/07 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
Angularjs中的$apply及优化使用详解
2018/07/02 Javascript
关于自定义Egg.js的请求级别日志详解
2018/12/12 Javascript
详解ES6 export default 和 import语句中的解构赋值
2019/05/28 Javascript
layui的数据表格+springmvc实现搜索功能的例子
2019/09/28 Javascript
解决Vue在Tomcat8下部署页面不加载的问题
2019/11/12 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python调用ctypes使用C函数printf的方法
2017/08/23 Python
PyQt5每天必学之弹出消息框
2018/04/19 Python
使用python批量化音乐文件格式转换的实例
2019/01/09 Python
Python实现二叉树的常见遍历操作总结【7种方法】
2019/03/06 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
Django实现随机图形验证码的示例
2020/10/15 Python
浅谈HTML5 defer和async的区别
2016/06/07 HTML / CSS
HTML5梦幻之旅——炫丽的流星雨效果实现过程
2013/08/06 HTML / CSS
英国汽车零件购物网站:GSF Car Parts
2019/05/23 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
大四学生毕业自荐信
2013/11/07 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
初中优秀班集体申报材料
2014/05/01 职场文书
无毒社区工作方案
2014/05/23 职场文书
中药学自荐信
2014/06/15 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
2014年个人技术工作总结
2014/12/08 职场文书
Mysql忘记密码解决方法
2022/02/12 MySQL