文档章节

PHP 7 新特性你知道多少?

 刘景刘恒
发布于 2017/06/07 09:17
字数 1112
阅读 4
收藏 0

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

 

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

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

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

它相当于:

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

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

 
  1. $a ?: 1

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

2. 函数返回值类型声明

官方文档提供的例子(注意 ... 的边长参数语法在 PHP 5.6 以上的版本中才有):

 
  1. <?php
  2. function arraysSum(array ...$arrays): array
  3. {
  4. return array_map(function(array $array): int {
  5. return array_sum($array);
  6. }, $arrays);
  7. }
  8.  
  9. print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。

这种声明的写法有些类似于 Swift

 
  1. func sayHello(personName: String) -> String {
  2. let greeting = "Hello, " + personName + "!"
  3. return greeting
  4. }

这个特性可以帮助我们避免一些 PHP 的隐式类型转换带来的问题。在定义一个函数之前就想好预期的结果可以避免一些不必要的错误。

不过这里也有一个特点需要注意。PHP 7 增加了一个 declare 指令:strict_types,既使用严格模式。

使用返回值类型声明时,如果没有声明为严格模式,如果返回值不是预期的类型,PHP 还是会对其进行强制类型转换。但是如果是严格模式, 则会出发一个 TypeError 的 Fatal error。

强制模式:

 
  1. <?php
  2. function foo($a) : int
  3. {
  4. return $a;
  5. }
  6.  
  7. foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

 
  1. <?php
  2. declare(strict_types=1);
  3.  
  4. function foo($a) : int
  5. {
  6. return $a;
  7. }
  8.  
  9. foo(1.0);
  10. # 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,即可以是函数,包括匿名函数),现在也可以使用 stringintfloat和 bool 了。

官方示例:

 
  1. <?php
  2. // Coercive mode
  3. function sumOfInts(int ...$ints)
  4. {
  5. return array_sum($ints);
  6. }
  7.  
  8. var_dump(sumOfInts(2, '3', 4.1));

需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

4. use 批量声明

PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:

 
  1. <?php
  2. use some\namespace\{ClassA, ClassB, ClassC as C};
  3. use function some\namespace\{fn_a, fn_b, fn_c};
  4. 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,Dream It Possible。

 更多PHP相关技术请搜索千锋PHP,做真实的自己,用良心做教育。。

© 著作权归作者所有

粉丝 1
博文 172
码字总数 139067
作品 0
私信 提问
PHP 7.3 比 PHP 7.0 快 22%,即将进入特性冻结阶段

随着上周 PHP 7.3 Alpha3 的发布,意味着 PHP 7.3 即将进入特性冻结阶段,不再有新的功能添加,后续的 beta 和 rc 版本将主要进行修复,直到11月29日发布正式版本。 从目前的更新说明来看,P...

王练
2018/07/12
10.1K
65
PHP 7 值得期待的新特性(上)

这是我们期待已久的 PHP 7 系列文章的第一篇。 或许你已经知道了,我在 PHP 5.0.0 时间轴 提的 RFC (Request For Comments)通过了, PHP 7 成为 PHP 下一个主要版本的名称。 无论你对此话题...

OneAPM蓝海讯通
2015/10/29
41
0
PHP 7 新特性(完结篇)

这是 PHP 7 、7.1 新特性系列的最后一篇了,至此, 算是对 PHP 7 、7.1 新特性做了一个比较完整的说明。其他两篇地址如下: PHP 7 类型提示 PHP 7 新增的生成器特性 空合并操作符(Null Coal...

2gua
2017/09/19
0
0
PhpStorm 10 发布,PHP 7 和 PHPUnit 5 支持

PhpStorm 10 正式版发布下载,此版本最主要的是 PHP 语言支持,编辑体验改进,调试器改进,代码分析改进和其他强大的新特性。 改进列表: PHP 语言和编辑体验:PHP 7支持 (including PHP 7 c...

oschina
2015/11/03
19.3K
46
试玩 PHP 5.4 的新特性

PHP 5.4 的正式版应该很快会发布了,目前的版本是 5.4 RC1,提前体验一下 PHP 5.4 的一些新特性。现在开始。 1. 实例化时访问类成员 2. 短数组定义语法 3. 支持 Class::{expr}() 语法 4. 通过...

鉴客
2011/11/30
6.2K
17

没有更多内容

加载失败,请刷新页面

加载更多

JS基础-该如何理解原型、原型链?

JS的原型、原型链一直是比较难理解的内容,不少初学者甚至有一定经验的老鸟都不一定能完全说清楚,更多的"很可能"是一知半解,而这部分内容又是JS的核心内容,想要技术进阶的话肯定不能对这个...

OBKoro1
今天
6
0
高防CDN的出现是为了解决网站的哪些问题?

高防CDN是为了更好的服务网络而出现的,是通过高防DNS来实现的。高防CDN是通过智能化的系统判断来路,再反馈给用户,可以减轻用户使用过程的复杂程度。通过智能DNS解析,能让网站访问者连接到...

云漫网络Ruan
今天
14
0
OSChina 周一乱弹 —— 熟悉的味道,难道这就是恋爱的感觉

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @xiaoshiyue :好久没分享歌了分享张碧晨的单曲《今后我与自己流浪》 《今后我与自己流浪》- 张碧晨 手机党少年们想听歌,请使劲儿戳(这里)...

小小编辑
今天
2.8K
24
SpringBoot中 集成 redisTemplate 对 Redis 的操作(二)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(二) List 类型的操作 1、 向列表左侧添加数据 Long leftPush = redisTemplate.opsForList().leftPush("name", name); 2、 向列表右......

TcWong
今天
46
0
排序––快速排序(二)

根据排序––快速排序(一)的描述,现准备写一个快速排序的主体框架: 1、首先需要设置一个枢轴元素即setPivot(int i); 2、然后需要与枢轴元素进行比较即int comparePivot(int j); 3、最后...

FAT_mt
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部