浅谈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 相关文章推荐
Win2000+Apache+MySql+PHP4+PERL安装使用小结
Oct 09 PHP
php将数据库中所有内容生成静态html文档的代码
Apr 12 PHP
PHP里的中文变量说明
Jul 23 PHP
解析左右值无限分类的实现算法
Jun 20 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
php判断表是否存在的方法
Jun 18 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
round robin权重轮循算法php实现代码
May 28 PHP
PHP读取大文件的几种方法介绍
Oct 27 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
Oct 07 PHP
thinkPHP+mysql+ajax实现的仿百度一下即时搜索效果详解
Jul 15 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中实现获取随机数组列表的自定义函数
2015/04/02 PHP
在php中设置session用memcache来存储的方法总结
2016/01/14 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
PHP5中使用mysqli的prepare操作数据库的介绍
2019/03/18 PHP
Aster vs Newbee BO5 第三场2.19
2021/03/10 DOTA
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
多种方法实现JS动态添加事件
2013/11/01 Javascript
jQuery插件分享之分页插件jqPagination
2014/06/06 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
使用coffeescript编写node.js项目的方法汇总
2015/08/05 Javascript
Jquery+Ajax+PHP+MySQL实现分类列表管理(下)
2015/10/28 Javascript
分享使用AngularJS创建应用的5个框架
2015/12/05 Javascript
JQuery+EasyUI轻松实现步骤条效果
2016/02/22 Javascript
Angular工具方法学习
2016/12/26 Javascript
jQuery插件HighCharts绘制2D金字塔图效果示例【附demo源码下载】
2017/03/09 Javascript
React Native之prop-types进行属性确认详解
2017/12/19 Javascript
nodejs取得当前执行路径的方法
2018/05/13 NodeJs
详解关于element el-button使用$attrs的一个注意要点
2018/11/09 Javascript
浅谈Vue服务端渲染框架Nuxt的那些事
2018/12/21 Javascript
JS实现的简单tab切换功能完整示例
2019/06/20 Javascript
基于ts的动态接口数据配置的详解
2019/12/18 Javascript
[03:20]2015国际邀请赛全明星表演赛
2015/08/08 DOTA
python实现的简单抽奖系统实例
2015/05/22 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
pyinstaller还原python代码过程图解
2020/01/08 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
Python爬虫获取op.gg英雄联盟英雄对位胜率的源码
2021/01/29 Python
viagogo波兰票务平台:演唱会、体育比赛、戏剧门票
2018/04/23 全球购物
宠物店的创业计划书范文
2014/01/11 职场文书
《金孔雀轻轻跳》教学反思
2014/04/20 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
禁毒心得体会范文
2016/01/15 职场文书
2016银行求职自荐信
2016/01/28 职场文书
Python的flask接收前台的ajax的post数据和get数据的方法
2021/04/12 Python
未发现nvidia显卡怎么办?Win11系统中未检测到nvidia显卡解决教程
2022/04/08 数码科技