浅谈php7的重大新特性


Posted in PHP onOctober 23, 2015

截止到目前为止,PHP官方已经发布了php7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了。后续一些版本的迭代主要也就是修修bug,优化之类的。下面就来说话我们一直期待的php7会有那些主要的变化了。。。

新特性预览

ZEND引擎升级到Zend Engine 3,也就是所谓的PHP NG
增加抽象语法树,使编译更加科学
64位的INT支持
统一的变量语法
原声的TLS - 对扩展开发有意义
一致性foreach循环的改进
新增 <=>、**、?? 、\u{xxxx}操作符
增加了返回类型的声明
增加了标量类型的声明
核心错误可以通过异常捕获了
增加了上下文敏感的词法分析

移除的一些特性

1.移除一些旧的扩展,被移迁移到了PECL(例如:mysql)
2.移除SAPIs的支持
3.<?和<? language=“php”这样的标签被移除了
4.16进制的字符串转换被废除了

//PHP5
"0x10" == "16"

//PHP7
"0x10" != "16"

5.HTTP_RAW_POST_DATA移除了(可以使用php://input替代)
6.静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了
$o = & new className{},不再支持这样的写法
7.php.ini文件移除了#作为注释,统一用;去注释

一些行为的改变

不在支持函数定义同名参数
类型的同名构造函数不推荐使用了(目前没有移除,后续会移除)
String、int、float等这些关键字不能被作为类名使用了
func_get_args()获取的是当前变量的值

function test ($num) {
  $num++;
  var_dump(func_get_args()[0]);
};

test(1)

//PHP5
int(1)

//PHP7
int(2)

下面就挑选了一些主要的、核心的、对我们PHPer来说比较重要的特性介绍一下

PHP NG

新的php引擎优化了很多地方,也正式因为如此,才使得php7相对于php5性能有了接近两倍的提升!

ZVAL结构的重构

浅谈php7的重大新特性

左边是PHP5的zval(24字节),右边是PHP7的zval(16字节);

可以看出来php7的zval要比php5还要复杂,但是却能从24个字节下降到16个字节,为什呢?

在C语言中struct的每一个成员变量要各自占据一块独立的内存空间,而union里的成员变量是共用一块内存空间(php7中大量使用union替换了struct)。因此,虽然成员变量看起来多了不少,但是实际占据的内存空间有很多都是公用的却下降了。

使用新的Zend Array替换之前的HashTale结构

我们php程序中使用最多、最有用、最方便、最灵活的就是数组了,而php5它的底层就是HashTable实现的,php7使用了新的Zend Array类型,性能和访问速度上都有了大幅度提升!
一些非常常用,开销不大的的函数直接变成了引擎支持的opcode

call_user_function(_array) => ZEND_INIT_USER_CALL
is_int/string/array/* => ZEND_TYPE_CHECK
strlen => ZEND_STRLEN
defined => ZEND+DEFINED

使用了新的内存分配,管理方式,减少了内存的浪费
核心排序zend_sort的优化

//PHP5 - 快速排序(非稳定排序)
array(1 => 0, 0 => 0)

//PHP7 - 快速排序+选择排序(稳定排序)
array(0 => 0, 1 => 0)

小于16个元素的使用选择排序,大于16个按照16个为单位去分割,分别使用选择排序,然后再全部合起来使用快速排序。排序较之前相比,内部元素由非稳定排序变成稳定排序,减少元素的交换次数,减少对内存的操作次数,性能提升40%
抽象语法树

浅谈php7的重大新特性

假如现在我们有这样的需求,要对php源文件就行语法检测,实现编码规范。php5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来实现;而php7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。

64位的INT支持

支持存储大于2GB的字符串
支持上传大小大于2GB的文件
保证字符串在所有平台上【64位】都是64bit
统一的语法变量

$$foo['bar']['baz']

//PHP5
($$foo)[‘bar']['baz']

//PHP7: 遵循从左到右的原则
${$foo[‘bar']['baz']}

foreach循环的改进

//PHP5
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a));}
int(2)
int(2)
int(2)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)

//PHP7:不再操作数据的内部指针了
$a = array(1, 2, 3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)

$a = array(1, 2, 3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)

新增的几个操作符

//<=> - 比较两个数的大小【-1:前者小于后者,0:前者等于后者,1:前者大于后者】
echo 1 <=> 2;//-1
echo 1 <=> 1;//0
echo 1 <=> 0;//1

// ** - 【a的b次方】
echo 2 ** 3;//8

//?? - 三元运算符的改进
//php5
$_GET['name'] ? $_GET['name'] : '';//Notice: Undefined index: …
//php7
$_GET['name'] ?? '' -> '';

//\u{xxxx} - Unicode字符的解析
echo "\u{4f60}";//你
echo "\u{65b0}";//新

返回类型的声明

function getInt() : int {
  return “test”;
};

getInt();

//PHP5
#PHP Parse error: parse error, expecting '{'...

//PHP7
#Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer, string returned

标量类型的声明

function getInt(int $num) : int {
  return $num;
};

getInt(“test”);

//PHP5
#PHP Catchable fatal error: Argument 1 passed to getInt() must be an instance of int, string given…

//PHP7
#Fatal error: Uncaught TypeError: Argument 1 passed to getInt() must be of the type integer, string given…

核心错误可以通过异常捕获了

try {
  non_exists_func();
} catch(EngineException $e) {
  echo “Exception: {$e->getMessage();}\n”;
}

//这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。
#Exception: Call to undefined function non_exists_func()

上下问敏感的词法分析

//PHP5
class Collection {public function foreach($arr) {}}
#Parse error: parse error, expecting `"identifier (T_STRING)”'...

//PHP7
class Collection {
  public function foreach($arr) {}
  public function in($arr){}
  public function where($condition){}
  public function order($condition){}
}
$collection = new Collection();
$collection->where()->in()->foreach()->order();

差不多了,基本上就把自己对php7的初步了解说完了,其中肯定有很多不对的、低级的错误,希望各位兄弟及时指正,我好改一下,做个笔记!嘿嘿!

PHP 相关文章推荐
一个简单计数器的源代码
Oct 09 PHP
Php 构造函数construct的前下划线是双的_
Dec 08 PHP
对text数据类型不支持代码页转换 从: 1252 到: 936
Apr 23 PHP
关于php连接mssql:pdo odbc sql server
Jul 20 PHP
PHP5中GD库生成图形验证码(有汉字)
Jul 28 PHP
php字符串分割函数用法实例
Mar 17 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
PHP SOCKET编程详解
May 22 PHP
基于ThinkPHP+uploadify+upload+PHPExcel 无刷新导入数据
Sep 23 PHP
php中使用websocket详解
Sep 23 PHP
DWZ+ThinkPHP开发时遇到的问题分析
Dec 12 PHP
php判断数组是否为空的实例方法
May 10 PHP
php数字每三位加逗号的功能函数
Oct 22 #PHP
jQuery+PHP发布的内容进行无刷新分页(Fckeditor)
Oct 22 #PHP
PHP+Mysql+jQuery查询和列表框选择操作实例讲解
Oct 22 #PHP
PHP实现无限级分类(不使用递归)
Oct 22 #PHP
PHP实现递归无限级分类
Oct 22 #PHP
php防止网站被攻击的应急代码
Oct 21 #PHP
PHP统计当前在线用户数实例讲解
Oct 21 #PHP
You might like
php下利用curl判断远程文件是否存在的实现代码
2011/10/08 PHP
php中array_multisort对多维数组排序的方法
2020/06/21 PHP
php实现简易聊天室应用代码
2015/09/23 PHP
php图片合成方法(多张图片合成一张)
2017/11/25 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
用JS提交参数创建form表单在FireFox中遇到的问题
2013/01/16 Javascript
textarea焦点的用法实现获取焦点清空失去焦点提示效果
2014/05/19 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
JQuery datepicker 用法详解
2015/12/25 Javascript
不用一句js代码初始化组件
2016/01/27 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
2018/09/25 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
从零学python系列之数据处理编程实例(一)
2014/05/22 Python
pycharm 使用心得(三)Hello world!
2014/06/05 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
2015/04/08 Python
Python使用Pycrypto库进行RSA加密的方法详解
2016/06/06 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
python中将一个全部为int的list 转化为str的list方法
2018/04/09 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
OpenCV python sklearn随机超参数搜索的实现
2020/01/17 Python
解决CSS3 transition-delay 属性默认值0不带单位失效的问题
2020/10/29 HTML / CSS
HTML5 audio标签使用js进行播放控制实例
2015/04/24 HTML / CSS
澳大利亚香水在线:Price Rite Mart
2017/12/28 全球购物
理肤泉俄罗斯官网:La Roche-Posay俄罗斯
2018/07/24 全球购物
Giglio俄罗斯奢侈品购物网:男士、女士、儿童高级时装
2018/07/27 全球购物
美团网旗下网上订餐平台:美团外卖
2020/03/05 全球购物
迪卡侬波兰体育用品商店:Decathlon波兰
2020/03/31 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
新三好学生主要事迹
2014/01/23 职场文书
2014年五四青年节活动策划书
2014/04/22 职场文书
四风查摆问题自查报告
2014/10/10 职场文书
爱岗敬业事迹材料
2014/12/24 职场文书
《我的长生果》教学反思
2016/02/20 职场文书
django注册用邮箱发送验证码的实现
2021/04/18 Python
浅谈Python项目的服务器部署
2021/04/25 Python
python模块与C和C++动态库相互调用实现过程示例
2021/11/02 Python