到目前为止,PHP7发布已经升级到7.3,本文来总结一下每个版本的变更与新特性

PHP7.0

1. 组合比较符 (<=>)

组合比较符号用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1,比较规则延续常规比较规则。对象不能进行比较

var_dump('PHP' <=> 'Node'); // int(1)
var_dump( <=> ); // int(-1)
var_dump(['a', 'b'] <=> ['a', 'b']); // int(0)

2. null合并运算符

由于日常使用中存在大量同时使用三元表达式和isset操作。使用null合并运算符可以简化操作

# php7以前
if(isset($_GET['a'])) {
$a = $_GET['a'];
}
# php7以前
$a = isset($_GET['a']) ? $_GET['a'] : 'none'; #PHP
$a = isset($_GET['a']) ?? 'none';

3.变量类型声明

变量类型声明有两种模式。一种是强制的,和严格的。允许使用下列类型参数intstringfloatbool

同时不能再使用int、string、float、bool作为类的名字了

function sumOfInts(int ...$ints)
{
return array_sum($ints);
}
ar_dump(sumOfInts(, '', 4.1)); // int(9)
# 严格模式
declare(strict_types=); function add(int $x, int $y)
{
return $x + $y;
}
var_dump(add('', )); // Fatal error: Argument 1 passed to add() must be of the type integer

4.返回值类型声明

增加了返回类型声明,类似参数类型。这样更方便的控制函数的返回值.在函数定义的后面加上:类型名即可

function fun(int $a): array
{
return $a;
}
fun();//Fatal error

5.匿名类

php7允许new class {} 创建一个匿名的对象。

//php7以前
class Logger
{
public function log($msg)
{
echo $msg;
}
} $util->setLogger(new Logger()); // php7+
$util->setLogger(new class {
public function log($msg)
{
echo $msg;
}
});

6.Unicode codepoint 转译语法

这接受一个以16进制形式的 Unicode codepoint,并打印出一个双引号或heredoc包围的 UTF-8 编码格式的字符串。 可以接受任何有效的 codepoint,并且开头的 0 是可以省略的

echo "\u{aa}";// ª
echo "\u{0000aa}";// ª
echo "\u{9999}";// 香

7.Closure::call

闭包绑定 简短干练的暂时绑定一个方法到对象上闭包并调用它。

class A {private $x = ;}

// PHP 7 之前版本的代码
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // 中间层闭包
echo $getX(); // PHP 7+ 及更高版本的代码
$getX = function() {return $this->x;};
echo $getX->call(new A);

8.带过滤的unserialize

提供更安全的方式解包不可靠的数据。它通过白名单的方式来防止潜在的代码注入

// 将所有的对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => false]); // 将除 MyClass 和 MyClass2 之外的所有对象都转换为 __PHP_Incomplete_Class 对象
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]); // 默认情况下所有的类都是可接受的,等同于省略第二个参数
$data = unserialize($foo, ["allowed_classes" => true]);

9. IntlChar类

这个类自身定义了许多静态方法用于操作多字符集的 unicode 字符。需要安装intl拓展

printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));

10.预期

它使得在生产环境中启用断言为零成本,并且提供当断言失败时抛出特定异常的能力。以后可以使用这个这个进行断言测试

ini_set('assert.exception', );

class CustomError extends AssertionError {}

assert(false, new CustomError('Some error message'));

11.命名空间按组导入

从同一个命名空间下导入的类、函数、常量支持按组一次导入

#php7以前
use app\model\A;
use app\model\B;
#php7+
use app\model{A,B}

12.生成器支持返回表达式

它允许在生成器函数中通过使用 return 语法来返回一个表达式 (但是不允许返回引用值), 可以通过调用 Generator::getReturn() 方法来获取生成器的返回值, 但是这个方法只能在生成器完成产生工作以后调用一次。

$gen = (function() {
yield ;
yield ; return ;
})(); foreach ($gen as $val) {
echo $val, PHP_EOL;
} echo $gen->getReturn(), PHP_EOL;
# output
//1
//2
//

13.生成器委派

现在,只需在最外层生成其中使用yield from,就可以把一个生成器自动委派给其他的生成器

function gen()
{
yield ;
yield ; yield from gen2();
} function gen2()
{
yield ;
yield ;
} foreach (gen() as $val)
{
echo $val, PHP_EOL;
}

14.整数除法函数intdiv

var_dump(intdiv(,)) //

15.会话选项设置

session_start() 可以加入一个数组覆盖php.ini的配置

session_start([
'cache_limiter' => 'private',
'read_and_close' => true,
]);

16.preg_replace_callback_array

可以使用一个关联数组来对每个正则表达式注册回调函数, 正则表达式本身作为关联数组的键, 而对应的回调函数就是关联数组的值

string preg_replace_callback_array(array $regexesAndCallbacks, string $input);
$tokenStream = []; // [tokenName, lexeme] pairs $input = <<<'end'
$a = ; // variable initialisation
end; // Pre PHP 7 code
preg_replace_callback(
[
'~\$[a-z_][a-z\d_]*~i',
'~=~',
'~[\d]+~',
'~;~',
'~//.*~'
],
function ($match) use (&$tokenStream) {
if (strpos($match[], '$') === ) {
$tokenStream[] = ['T_VARIABLE', $match[]];
} elseif (strpos($match[], '=') === ) {
$tokenStream[] = ['T_ASSIGN', $match[]];
} elseif (ctype_digit($match[])) {
$tokenStream[] = ['T_NUM', $match[]];
} elseif (strpos($match[], ';') === ) {
$tokenStream[] = ['T_TERMINATE_STMT', $match[]];
} elseif (strpos($match[], '//') === ) {
$tokenStream[] = ['T_COMMENT', $match[]];
}
},
$input
); // PHP 7+ code
preg_replace_callback_array(
[
'~\$[a-z_][a-z\d_]*~i' => function ($match) use (&$tokenStream) {
$tokenStream[] = ['T_VARIABLE', $match[]];
},
'~=~' => function ($match) use (&$tokenStream) {
$tokenStream[] = ['T_ASSIGN', $match[]];
},
'~[\d]+~' => function ($match) use (&$tokenStream) {
$tokenStream[] = ['T_NUM', $match[]];
},
'~;~' => function ($match) use (&$tokenStream) {
$tokenStream[] = ['T_TERMINATE_STMT', $match[]];
},
'~//.*~' => function ($match) use (&$tokenStream) {
$tokenStream[] = ['T_COMMENT', $match[]];
}
],
$input
);

17.随机数、随机字符函数

string random_bytes(int length);
int random_int(int min, int max);

18.define 支持定义数组

#php7+
define('ALLOWED_IMAGE_EXTENSIONS', ['jpg', 'jpeg', 'gif', 'png']);

PHP7.0变化

1. 错误和异常处理相关变更

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。 因为在 PHP 7 版本中,已经使用抛出异常的错误处理机制了。 (如果代码中没有捕获 Error 异常,那么会引发致命错误)。set_error_handle不一定接收的是异常,有可能是错误。

ERROR层级结构

interface Throwable
|- Exception implements Throwable
|- ...
|- Error implements Throwable
|- TypeError extends Error
|- ParseError extends Error
|- AssertionError extends Error
|- ArithmeticError extends Error
|- DivisionByZeroError extends ArithmeticError function handler(Exception $e) { ... }
set_exception_handler('handler'); // 兼容 PHP 5 和 7
function handler($e) { ... } // 仅支持 PHP 7
function handler(Throwable $e) { ... }

2. list

list 会按照原来的顺序进行赋值。不再是逆序了

list($a,$b,$c) = [,,];
var_dump($a);//
var_dump($b);//
var_dump($c);//

list不再支持解开字符串

3. foreach不再改变内部数组指针

<?php
$array = [, , ];
foreach ($array as &$val) {
var_dump(current($array));
}
?>
#php
int()
int()
bool(false)
#php7
int()
int()
int()

4. 十六进制字符串不再被认为是数字

var_dump("0x123" == "");
#php5
true
#php7
false

5.$HTTP_RAW_POST_DATA 被移

$HTTP_RAW_POST_DATA 被移 使用php://input代替

6. 移除了 ASP 和 script PHP 标签

开标签 闭标签
<% %>
<%= %>
<script language="php"> </script>

PHP7.1

1. 可为空(Nullable)类型

参数以及返回值的类型现在可以通过在类型前加上一个问号使之允许为空。当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是null

#php5
function($a = null){
if($a===null) {
return null;
}
return $a;
}
#php7+
function fun() :?string
{
return null;
} function fun1(?$a)
{
var_dump($a);
}
fun1(null);//null
fun1('');//

2. void 类型

返回值声明为 void 类型的方法要么干脆省去 return 语句。对于 void来说,NULL 不是一个合法的返回值。

function fun() :void
{
echo "hello world";
}

3. 类常量可见性

class Something
{
const PUBLIC_CONST_A = ;
public const PUBLIC_CONST_B = ;
protected const PROTECTED_CONST = ;
private const PRIVATE_CONST = ;
}

4. iterable 伪类

这可以被用在参数或者返回值类型中,它代表接受数组或者实现了Traversable接口的对象.

function iterator(iterable $iter)
{
foreach ($iter as $val) {
//
}
}

5. 多异常捕获处理

一个catch语句块现在可以通过管道字符(|)来实现多个异常的捕获。 这对于需要同时处理来自不同类的不同异常时很有用

try {
// some code
} catch (FirstException | SecondException $e) {
// handle first and second exceptions
}

6. list支持键名

$data = [
["id" => , "name" => 'Tom'],
["id" => , "name" => 'Fred'],
]; // list() style
list("id" => $id1, "name" => $name1) = $data[];
var_dump($id1);//

7. 字符串支持负向

$a= "hello";
$a[-];//l

8. 将callback 转闭包

Closure新增了一个静态方法,用于将callable快速地 转为一个Closure 对象。

<?php
class Test
{
public function exposeFunction()
{
return Closure::fromCallable([$this, 'privateFunction']);
} private function privateFunction($param)
{
var_dump($param);
}
} $privFunc = (new Test)->exposeFunction();
$privFunc('some value');

9. http2 服务推送

对http2服务器推送的支持现在已经被加入到 CURL 扩展

PHP7.1变更

1. 传递参数过少时将抛出错误

过去我们传递参数过少 会产生warning。php7.1开始会抛出error

2. 移除了ext/mcrypt拓展

PHP7.2

1. 增加新的类型object

function test(object $obj) : object
{
return new SplQueue();
} test(new StdClass());

2. 通过名称加载扩展

扩展文件不再需要通过文件加载 (Unix下以.so为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用

. 通过名称加载扩展
扩展文件不再需要通过文件加载 (Unix下以.so为文件扩展名,在Windows下以 .dll 为文件扩展名) 进行指定。可以在php.ini配置文件进行启用

3.允许重写抽象方法

当一个抽象类继承于另外一个抽象类的时候,继承后的抽象类可以重写被继承的抽象类的抽象方法。

<?php

abstract class A
{
abstract function test(string $s);
}
abstract class B extends A
{
// overridden - still maintaining contravariance for parameters and covariance for return
abstract function test($s) : int;
}

4. 使用Argon2算法生成密码散列

Argon2 已经被加入到密码散列(password hashing) API (这些函数以 password_ 开头), 以下是暴露出来的常量

5. 新增 PDO 字符串扩展类型

当你准备支持多语言字符集,PDO的字符串类型已经扩展支持国际化的字符集。以下是扩展的常量:

  • PDO::PARAM_STR_NATL

  • PDO::PARAM_STR_CHAR

  • PDO::ATTR_DEFAULT_STR_PARAM

$db->quote('über', PDO::PARAM_STR | PDO::PARAM_STR_NATL);

6. 命名分组命名空间支持尾部逗号

use Foo\Bar\{
Foo,
Bar,
Baz,
};

PHP7.2变更

1. number_format 返回值

var_dump(number_format(-0.01)); // now outputs string(1) "0" instead of string(2) "-0"

2. get_class()不再允许null。

var_dump(get_class(null))// warning

3. count 作用在不是 Countable Types 将发生warning

count(), // integers are not countable

4. 不带引号的字符串

在之前不带引号的字符串是不存在的全局常量,转化成他们自身的字符串。现在将会产生waring。

5. __autoload 被废弃

__autoload方法已被废弃

6. each 被废弃

使用此函数遍历时,比普通的 foreach 更慢, 并且给新语法的变化带来实现问题。因此它被废弃了。

7. is_object、gettype修正

is_object 作用在**__PHP_Incomplete_Class** 将反正 true

gettype作用在闭包在将正确返回resource

8. Convert Numeric Keys in Object/Array Casts

把数组转对象的时候,可以访问到整型键的值。

// array to object
$arr = [ => ];
$obj = (object)$arr;
var_dump(
$obj,
$obj->{''}, // now accessible
$obj->{} // now accessible
);

PHP7.3

添加了 array_key_first() 和 array_key_last() 来获取数组的第一个和最后一个元素的键名

添加了 fpm_get_status() 方法, 来获取FPM状态数组,

添加了几个FPM的配置项, 用来控制日志单行最大字符数, 日志缓冲等: log_limit, log_buffering, decorate_workers_output

libcurl >= 7.15.5 is now required

curl 添加了一堆常量

json_decode 添加了一个常量, JSON_THROW_ON_ERROR, 如果解析失败可以抛出异常, 而不是通过之前的方法 json_last_error() 去获取

spl autoloader: 如果一个加载失败, 剩下的都不再执行

说明了一些循环引用的情况会得到怎样的结果

heredoc/nowdoc  中如果遇到跟定界符相同的字符串就认为结束了,  而最后真正的结束符则会被认为是语法错误;

在 循环+switch-case 语句的case 中使用continue 会报warning

说明了, 静态变量在被继承时, 如果在子类里发生了循环引用, 父类里的静态变量会跟着变

PHP7.0-PHP7.3新特性与变更的更多相关文章

  1. ABP Framework 5.0 RC.1 新特性和变更说明

    .Net 6.0 发布之后,ABP Framework 也在第一时间进行了升级,并在一个多星期后(2021-11-16)发布了 5.0 RC.1 ,新功能和重要变更基本已经确定. 5.0版本新特性 新 ...

  2. [PHP7.0-PHP7.2]的新特性和新变更

    php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...

  3. 有史来最大改变 Android 5.0十大新特性

    有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 )   距离Android系统上一次重大更新不到一年的时间,谷歌 ...

  4. sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server

    sudo apt-get install apache2 php7.0 php7.0-mysql mysql-server sudo apt-get install libapache2-mod-ph ...

  5. C# 6.0可能的新特性及C#发展历程

    据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...

  6. C# 6.0可能的新特性

    C# 6.0可能的新特性 1.主构造函数(Primary Constructors) 主构造函数给类中的变量赋值 Before public class Point { private int x, ...

  7. Spring Boot 2.0正式发布,新特性解读

    作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...

  8. C# 6.0可能的新特性及C#发展历程[转]

      C# 6.0可能的新特性及C#发展历程[转] 年10月份发布了,对应的是.Net Franework 4.5.1. 或者3年,更新增加的东西会比较多,所以对于C# 6.0,还是有一些期待的. 下面 ...

  9. MySQL 8.0.2复制新特性(翻译)

    译者:知数堂星耀队 MySQL 8.0.2复制新特性 MySQL 8 正在变得原来越好,而且这也在我们MySQL复制研发团队引起了一阵热潮.我们一直致力于全面提升MySQL复制,通过引入新的和一些有趣 ...

  10. Atitit.c# .net 3.5 4.0 4.5 5.0 6.0各个版本新特性战略规划总结

    Atitit.c# .net 3.5 4.0 各个版本新特性战略规划总结 1. --------------.Net Framework版本同CLR版本的关系1 2. paip.----------- ...

随机推荐

  1. 死磕 java集合之ConcurrentSkipListMap源码分析——发现个bug

    前情提要 点击链接查看"跳表"详细介绍. 拜托,面试别再问我跳表了! 简介 跳表是一个随机化的数据结构,实质就是一种可以进行二分查找的有序链表. 跳表在原有的有序链表上面增加了多级 ...

  2. SpringBoot整合Swagger2,再也不用维护接口文档了!

    前后端分离后,维护接口文档基本上是必不可少的工作.一个理想的状态是设计好后,接口文档发给前端和后端,大伙按照既定的规则各自开发,开发好了对接上了就可以上线了.当然这是一种非常理想的状态,实际开发中却很 ...

  3. RecyclerFlexboxLayoutManagerDemo【使用FlexboxLayoutManager实现流式布局】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 FlexboxLayout是一个Google 开源的库项目,它将CSS Flexible Box Layout Module的类似功 ...

  4. 使用C#开发windows服务定时发消息到钉钉群_群组简单消息

    前言:本提醒服务,是由C#语言开发的,主要由windows服务项目和winform项目组成,运行服务可实现功能:向钉钉自定义机器人群组里,定时,定次,推送多个自定义消息内容,并实现主要功能的日志记录. ...

  5. 微信ChatEmoji表情适配,对微信公众号开发有帮助

    最近做微信公众号时发现微信ChatEmoji表情与接受的消息显示表情的问题, 微信表情后面的ChatEmoji显示不出,花了一些时间整理,把pc和手机的表情全部都整理了, 由于有两百多个显示可能有点长 ...

  6. 戏说程序猿之cannot find the object

    “别开玩笑了,程序员哪里需要对象!” 程序员难找对象原因无非如下: 1.工作时间长,恋爱时间少 2.性格偏于内向,不主动 3.不注意个人形象 程序员爱情观: 爱情就是死循环,一旦执行就陷进去了: 爱上 ...

  7. Openresty的同步输出与流式响应

    Openresty的同步输出与流式响应 默认情况下, ngx.say和ngx.print都是异步输出的,先来看一个例子: location /test { content_by_lua_block { ...

  8. async await详解

    async await本身就是promise + generator的语法糖. 本文主要讲述以下内容 async awiat 实质 async await 主要特性 async await 实质 下面 ...

  9. 【土旦】vue项目中 使用 pako.js 解密 gzip加密字符串

    前言 今天跟后台对接一个接口,接受到一个加密的值,说是通过gzip加密过的,然后就蒙蔽了, 赶紧上百度找了一下资料,通过一篇文章(原文在底部)发现有个js库可以解密,就下载轻松解密了 实现代码 pok ...

  10. 洛谷P2664 树上游戏(点分治)

    题意 题目链接 Sol 神仙题..Orz yyb 考虑点分治,那么每次我们只需要统计以当前点为\(LCA\)的点对之间的贡献以及\(LCA\)到所有点的贡献. 一个很神仙的思路是,对于任意两个点对的路 ...