PHP7.0-PHP7.3新特性与变更
到目前为止,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.变量类型声明
变量类型声明有两种模式。一种是强制的,和严格的。允许使用下列类型参数int、string、float、bool
同时不能再使用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新特性与变更的更多相关文章
- ABP Framework 5.0 RC.1 新特性和变更说明
.Net 6.0 发布之后,ABP Framework 也在第一时间进行了升级,并在一个多星期后(2021-11-16)发布了 5.0 RC.1 ,新功能和重要变更基本已经确定. 5.0版本新特性 新 ...
- [PHP7.0-PHP7.2]的新特性和新变更
php7发布已经升级到7.2.里面发生了很多的变化.本文整理php7.0至php7.2的新特性和一些变化. 参考资料: http://php.net/manual/zh/migration70.new ...
- 有史来最大改变 Android 5.0十大新特性
有史来最大改变 Android 5.0十大新特性 2014.10.16 14:51:31 来源:腾讯数码作者:腾讯数码 ( 0 条评论 ) 距离Android系统上一次重大更新不到一年的时间,谷歌 ...
- 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 ...
- C# 6.0可能的新特性及C#发展历程
据扯,C# 6.0在不远的将来就发布了,对应的IDE可能是VS 2014(.Net Framework 5.0),因为VS 2013已于2013年10月份发布了,对应的是.Net Franework ...
- C# 6.0可能的新特性
C# 6.0可能的新特性 1.主构造函数(Primary Constructors) 主构造函数给类中的变量赋值 Before public class Point { private int x, ...
- Spring Boot 2.0正式发布,新特性解读
作者|翟永超 Spring Boot 2.0 来啦,有哪些新特性?升级吗? 写在前面 北京时间 3 月 1 日,经过漫长的等待之后,Spring Boot 2.0 正式发布.作为 Spring 生态中 ...
- C# 6.0可能的新特性及C#发展历程[转]
C# 6.0可能的新特性及C#发展历程[转] 年10月份发布了,对应的是.Net Franework 4.5.1. 或者3年,更新增加的东西会比较多,所以对于C# 6.0,还是有一些期待的. 下面 ...
- MySQL 8.0.2复制新特性(翻译)
译者:知数堂星耀队 MySQL 8.0.2复制新特性 MySQL 8 正在变得原来越好,而且这也在我们MySQL复制研发团队引起了一阵热潮.我们一直致力于全面提升MySQL复制,通过引入新的和一些有趣 ...
- 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.----------- ...
随机推荐
- qml demo分析(photosurface-图片涅拉)
阅读qml示例代码已有一小段时间,也陆续的写了一些自己关于qml示例代码的理解,可能由于自己没有大量的qml开发经验,总感觉复杂的ui交互qml处理起来可能会比较棘手,但事实总是会出人意料,今天我们就 ...
- ASP.NET Core WebApi中使用FluentValidation验证数据模型
原文链接:Common features in ASP.NET Core 2.1 WebApi: Validation 作者:Anthony Giretti 译者:Lamond Lu 介绍 验证用户输 ...
- Session的使用与Session共享问题
Session的使用与Session共享问题 Session方法 getId():获取sessionId,这个id不一定是数字,比方说它用字符串来表示唯一标识,所以它返回值是String; boole ...
- 外行人都能看懂的SpringCloud,错过了血亏!
一.前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦,去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)... 所以,这篇主要来讲讲SpringCloud的一些基础的 ...
- 自定义GridControl编辑器
本文版权归博主 惊梦无痕 所有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作.SourceLink 鉴于网上的针对GridControl的一些代码比较凌乱,且功能分散,故将整理过的代码分享出来 ...
- EF获取多个数据集以及MySQL分页数据查询优化
背景:MySQL分页查询语句为 ,10; 一般页面还会获取总条数,这时候还需要一条查询总条数语句 , 这样数据库需要执行两次查询操作.MySQL提供了SQL_CALC_FOUND_ROWS追踪总条数的 ...
- Spring Aop底层原理详解
Spring Aop底层原理详解(来源于csdn:https://blog.csdn.net/baomw)
- Java 平台无关性的基石
Java 在刚刚诞生之初就提出过一个非常著名的口号:"一次编写,到处运行", 这句话充分表达了软件开发人员对冲破平台界限的渴望 在竞争激烈的 IT 领域,各种不同的硬件体系结构和不 ...
- phpstorm本地怎么上传到服务器
连接服务器 菜单栏找到[工具/Tools]->[Deployment/部署]->[Confinguration…/配置…]. 点加号(+),添加一台服务器,填写名称,选择类型为SFTP,点 ...
- 我的世界 ParaCraft 结合开源地图 OpenStreetMap 生成3D校园的方法简介
我的世界ParaCraft结合开源地图OpenStreetMap生成3D校园的方法简介 版本1.0 日期2019.2.3 作者Ray (82735589@qq.com) www.TimeGIS.com ...