PHP 7.0新增特性详解
https://www.cnblogs.com/riverdubu/archive/2017/03/22/6434705.html
开始介绍PHP7.0新特性,具体的可以参照官网的介绍,我来挑一些给大家详细讲解下
http://php.net/manual/en/migration70.new-features.php
1. ?? 运算符(NULL 合并运算符)
$a = $_GET['a'] ?? 1;
它相当于:
$a = empty($_GET['a']) ? 1 : $_GET['a'];
我们知道三元运算符是可以这样用的:
$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]));
从这个例子中可以看出现在函数(包括匿名函数)都可以指定返回值的类型。
这个特性可以帮助我们避免一些 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
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 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。
再来简单说几个:
1、PHP 5.3 开始有了匿名函数,现在又有了匿名类了;
2、define 现在可以定义常量数组;
3、闭包( Closure)增加了一个 call 方法;
4、生成器(或者叫迭代器更合适)可以有一个最终返回值(return),也可以通过 yield from
的新语法进入一个另外一个生成器中(生成器委托)。
生成器的两个新特性(return 和 yield from
)可以组合。具体的大家可以自行测试。
PHP 7.0新增特性详解相关推荐
- C#各个版本中的新增特性详解
序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...
- Servlet 3.0 新特性详解
https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE ...
- Java—Java 8 新增特性详解(Predicate和Stream)
Predicate接口 Predicate接口介绍 Predicate是函数式接口,可以使用Lambda表达式作为参数.Java 8为集合Collection新增了removeIf(Predica ...
- C# 9.0新特性详解系列之五:记录(record)和with表达式
1 背景与动机 传统面向对象编程的核心思想是一个对象有着唯一标识,表现为对象引用,封装着随时可变的属性状态,如果你改变了一个属性的状态,这个对象还是原来那个对象,就是对象引用没有因为状态的改变而改变, ...
- JDK1.6.0新特性详解与代码示例 - 徐明明的博客 - CSDNBlog
JDK6.0发布有段时间了,新的JDK也有不少新的特性,我去网上搜集了一下,列在下面和大家一起学习. 1.Desktop和SystemTray. 在JDK6中 ,AWT新增加了两个类:Desktop和 ...
- 03-Spring Boot 2.0 新特性详解
背景 在 3 月 1 号,Spring Boot2.0.0.RELEASE正式发布,这是 Spring Boot1.0 发布 4 年之后第一次重大修订,因此有多的新功能和特性值得大家期待!下面带大家了 ...
- android8.0的蓝牙版本,android o 新特性详解 安卓8.0蓝牙音频增强以及更加可爱的表情包...
android 8.0什么时候推出?有哪些新特色?很多安卓用户非常想知道答案吧!不用着急,下面是大麦子小编整理出来的安卓8.0新特性详解,希望可以帮到大家. 有媒体近日曝光了有关谷歌Pixel XL ...
- UE5 官方案例Lyra 全特性详解 11.背包系统Inventory System 0
UE5 官方案例Lyra 全特性详解 0. 前言 1. 前置声明 2. 修复背包游戏体验不加载的问题 2.1 通过输出日志的警告找到问题根源 2.2 修复资源加载的问题 3. 交互按钮不起作用 4. ...
- 还在用JDK6的同学,来看看JDK13新特性详解吧
点击上方"搜云库技术团队"关注,选择"设为星标" 回复"面试题"或"1024"获取 4T 学习资料 在 JDK 版本的世 ...
最新文章
- 相机定位 | cv paper整理
- 《VMware Virtual SAN权威指南》一3.10.3 缓存设备与容量设备的比率
- 在ashx中使用Session
- vivaldi浏览器_上网高阶用户怎么能少了这3个无广告、安全免费的浏览器呢
- Flume碰到begin()is called when the transaction is open
- 第二章 认识计算机硬件
- The parent project must have a packaging type of POM
- 避重就轻:Intel的垄断抗辩
- 文后参考文献著录规则
- WEP密码破解BT3-spoonwep2教程及下…
- 修改XP登陆界面教程
- 让HTML播放器使用指定ua,chimee-mobile-player
- 智能楼宇一卡通系统QY-LY04A
- 微信公众号自定义分享踩坑
- 哪些人需要发表期刊论文
- 压六类双绞线网线水晶头,
- matplotlib 配色之内置 colormap
- Android打开系统自带文件管理器,全选菜单选项
- 详解Pod和容器资源管理和分配(CPU和内存分配,临时存储管理)
- 软件性能测试场景设计,性能测试场景设计杂谈