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

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

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

它相当于:

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

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

$a ?: 1

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

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。

强制模式:

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

转载于:https://www.cnblogs.com/syphper/p/5630281.html

PHP 7 的五大新特性相关推荐

  1. 怎么真正入行Web前端行业?JavaScript五大新特性是什么?

    怎么真正入行Web前端行业?JS五大新特性是什么?JavaScript是Web开发者必学的三种语言之一,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言.随着互联网的更迭以及技术的革新,Jav ...

  2. php7的核心开发者,php7 五大新特性

    2. 函數返回值類型聲明 官方文檔提供的例子(注意 - 的邊長參數語法在 PHP 5.6 以上的版本中才有): functionarraysSum(array...$arrays):array { r ...

  3. Java EE 8的五大新特性详解

    Java EE 8的五大新特性详解 2018.4.3 版权声明:本文为博主chszs的原创文章,未经博主允许不得转载. Java EE 8带来了很多新特性,其中最好的新特性有下面五个. 备受期待的Ja ...

  4. QGIS 3.20 五大新特性解析

    2021年6月18日,经过4个月的开发周期,QGIS发布了最新版(LR)QGIS 3.20,随之一同发布的还有长期稳定版(LTR)QGIS 3.16.8. 相比3.18版为期4天的打包过程,本次打包时 ...

  5. 独家 | Python 3.10发布——你应该知道的五大新特性

    作者:Varun Singh 翻译:欧阳锦校对:王可汗本文约1700字,建议阅读5分钟 本文为大家介绍了新版本Python的新特性. 图片来源:Canva--由Varun Singh编辑 我们都知道P ...

  6. JDK 13 的五大新特性!你最中意哪个?

    点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 来源:阿飞的博客 关注我,回复口令获取可获取独家整理的学习资料: - 001:领取<Spring ...

  7. Java 14 中令人期待的五大新特性!

    随着新的 Java 发布生命周期的到来,新版本预计将于 2020 年 3 月发布,本文将对其中的 5 个主要特性作些概述. 作者 | Sylvain Saurel 译者 | 苏本如,责编 | 郭芮 出 ...

  8. 朱凯:ClickHouse 全貌介绍与年度最令人兴奋的五大新特性

    分享嘉宾:朱凯 明源云 大数据平台首席专家 编辑整理:肖鹏 VIVO 出品平台:DataFunTalk 导读:都说天下武功唯快不破,ClickHouse 从2016年诞生至今就一直快字著称.Click ...

  9. C# 5.0五大新特性

    第一:绑定运算符,:=: 这个只是简化了数据绑定,跟ASP.NET MVC3不断改进一样,其实不是什么亮点改进. comboBox1.Text :=: textBox1.Text; //将文本框的内容 ...

最新文章

  1. oracle文件夹cwallet,Oracle Wallet
  2. 基于Docker + Consul + Nginx + Consul-template的服务负载均衡实现
  3. 【前端】设计更好的数据表
  4. Nginx重写规则指南
  5. 如何建立数学模型系列之【一.通俗解释及相关概念】
  6. 微信小程序:调用API接口
  7. 2022山东理工大学pta程序设计---实验四1---13题解
  8. 如何建设软件质量保障体系
  9. 艾宾浩斯遗忘曲线PHP,艾宾浩斯遗忘曲线复习计划表-2018新版.pdf
  10. 爆肝三个晚上,成功高仿出Win 11的部分界面【持续更新】【萌新也能看的懂】【开源了,强烈建议收藏】
  11. 点击百度网盘安装包无反应
  12. 北京市小汽车摇号程序的反编译、算法及存在的问题浅析
  13. 2021-06-14 Socketio学习使用搭建一个聊天室
  14. word中添加背景色
  15. cookie、seesionStorage、localStoreg的区别
  16. 计算机图形学 旋转平移原理,计算机图形旋转操作详细步骤
  17. 用range函数解码高斯等差数列求和
  18. DevOps 工具链
  19. LintCode 题目:LintCode的使用以及A + B 问题
  20. 业内“大师级Dubbo实战笔记”面世

热门文章

  1. JZ32 从上往下打印二叉树
  2. java string转sql date_Java中的util.Date,sql.Date,sql.Time,String类型转换
  3. core 实例化接口_实例讲解Springboot整合MongoDB进行CRUD操作的两种方式
  4. 牛市该理智还是疯狂?python+BI可视化的股票分析,都是你想看的
  5. IPhone之NSXMLParser的使用
  6. 会mysql不会sql_不是吧,不会有人还不知道MySQL中具实用的SQL语句
  7. 基于Android的家庭财务管理流程图,SYL_Android_FamilyFinaceSystem 双鱼林基于安卓Android家庭财务管理系统毕业课程设计源码 - 下载 - 搜珍网...
  8. linux清除asm磁盘分区,ASM Diskgroup添加与删除
  9. radiobuttonlist 后面追加操作按钮_【进口知识】通关无纸化签约及代理报关委托收发操作指南...
  10. pycharm检测不到python编译器_1.2 搭建python+pycharm编程开发环境