php7与php5的区别,PHP7和PHP5区别
PHP7比PHP5.0 ~ 5.6快了近5倍,同时还降低了对系统资源的占用。主要是PHP7对Zend引擎进行了深度优化。
之前在书上看到过两者比较全面的区别,回头去翻了翻书【眼过千遍,不如手过一遍啊】,特记录如下。
分三个方面来比较:
0、底层优化
1、语法变化
2、性能变化
0、增加抽象语法树(AST)。
PHP5:PHP代码在语法解析阶段直接生成opline指令,执行器直接执行opline指令。
PHP7: PHP代码解析生成抽象语法树,然后将抽象语法树编译成opline指令。解耦编译器和执行器。
1、Native TLS(线程局部存储)
PHP5: 通过参数传递的方式传递本线程资源池。容易遗漏、并且及其不优雅。
PHP7: 使用Native TLS来保存线程的资源池。
2、指定函数参数、返回值类型
PHP7: 指定了函数参数和返回值类型。
注意⚠️:如果类型不一致会报error错误。尝试了不太好用,比如int和string不好分,input过来的id=1是string, 代码中是int, 需要手动转换。
3、zval结构的变化。
PHP5: refcount__gc在zval中;zval结构大小24byte。
PHP7: refcount__gc在zval的value中;zval结构大小16byte。
3.1、PHP5 zval结构
定义文件{PHPSRC}/Zend/zend.h
typedef struct _zval_struct {
zvalue_value value;
zend_uint refcount__gc;
zend_uchar type;
zend_uchar is_ref__gc;
} zval;
typedef union _zvalue_value {
long lval;
double dval;
struct {
char *val;
int len;
} str;
HashTable *ht;
zend_object_value obj;
} zvalue_value;
typedef struct _zval_struct zval;
struct _zval_struct {
zend_value value;/* value */
union {
struct {
ZEND_ENDIAN_LOHI_3(
zend_uchar type,/* active type */
zend_uchar type_flags,
union {
uint16_t extra; /* not further specified */
} u)
} v;
uint32_t type_info;
} u1;
union {
uint32_t next; /* hash collision chain */
uint32_t cache_slot; /* cache slot (for RECV_INIT) */
uint32_t opline_num; /* opline number (for FAST_CALL) */
uint32_t lineno; /* line number (for ast nodes) */
uint32_t num_args; /* arguments number for EX(This) */
uint32_t fe_pos; /* foreach position */
uint32_t fe_iter_idx; /* foreach iterator index */
uint32_t access_flags; /* class constant access flags */
uint32_t property_guard; /* single property guard */
uint32_t constant_flags; /* constant flags */
uint32_t extra; /* not further specified */
} u2;
};
typedef union _zend_value {
zend_long lval;/* long value */
double dval;/* double value */
zend_refcounted *counted;
zend_string *str;
zend_array *arr;
zend_object *obj;
zend_resource *res;
zend_reference *ref;
zend_ast_ref *ast;
zval *zv;
void *ptr;
zend_class_entry *ce;
zend_function *func;
struct {
uint32_t w1;
uint32_t w2;
} ww;
} zend_value;
4、异常处理
PHP7将多数错误改为异常抛出。
PHP5: 调用的方法不存在报error。
PHP7: 可通过try catch捕获,使得错误处理更加可控。
try {
salmonl();
} catch (Throwable $e) {
var_dump($e->getMessage);
}
// PHP5下运行结果
// Fatal error: Call to undefined function salmonl() in [...][...] on line 3
// PHP7下运行结果
// Notice: Undefined property: Error::$getMessage in [...][...] on line 5
说明:PHP7下是通过Throwable异常类来捕获的,Throwable是父类,Exception类和Error类是子类。
5、HashTable的变化。
PHP5: HashTable结构大小72tye; 数组元素Bucket结构72byte。
PHP7: HashTable结构大小56tye; 数组元素Bucket结构32byte。
6、执行器。
PHP5: 通过执行器的调度函数execute_ex()传递execute_data和opline两个变量。
PHP7: execute_data和opline通过寄存器变量存储。
7、新的参数解析方式。
PHP7: 定义2个宏包裹待解析参数。
8、语法新特性
8.0、null合并运算符
// PHP5
$id = isset($_GET['id']) ? $_GET['id'] : 0;
// PHP7
$id = $_GET['id'] ?? 0;
8.1、太空船操作符
// PHP5
usort($datas, function ($a, $b) {
if ($a['score'] == $b['score']) {
return 0;
}
return ($a['score'] < $b['score']) ? 1 : -1;
});
// PHP7
usort($datas, function ($a, $b) {
return $b['score'] <=> $a['score'];
});
8.2、define定义常量数组
// version >= 5.6
const IT = ['sina', 'baidu', 'tencent'];
echo IT[0];
// version >= 7.0
define('IT', ['sina', 'baidu', 'tencent']);
echo IT[0];
参考:
《PHP7内核剖析》
手册:PHP7新特性
php7与php5的区别,PHP7和PHP5区别相关推荐
- PHP5.6升级PHP7总结
前言 本文是一篇讲座听后+后续研究的总结. 话说当年追时髦,php7一出就给电脑立马装上了,php5和php7共存,也是立马写了个超级耗时间的循环脚本测了一番,确实php7给力很多,然后也是注意了一些 ...
- php5.3 php7兼容,Centos搭建PHP7.0.x让php5.3和php7兼容共存教程
先安装php5.3 就不说,说Centos搭建PHP7.0教程: # wget http://php.net/get/php-7.0.4.tar.gz/from/a/mirror 解压安装 # ta ...
- Cento7 PHP5.6 升级 PHP7.0.0
下载PHP7包 wget http://am1.php.net/get/php-7.0.0.tar.gz/from/this/mirror 解压 tar xf php-7.0.0.tar.gz$cd ...
- php5.3 with-mysql centos_Centos编译搭建php7让php5.3和php7兼容共存教程
PHP7版本现在在linux系统中已经开始使用起来了,下面我们来看一篇关于Centos搭建PHP7.0.x让php5.3和php7兼容共存教程,希望下文对各位有帮助. 先安装php5.3 就不说,说C ...
- php7安装memcached,PHP5.6与PHP7的memcached安装
因需要兼容旧系统,所以服务器还保留了PHP5.6,有些比较新的系统就直接上PHP7了 PHP5.6的安装位置是 /usr/local/php PHP7的安装位置是 /usr/local/php7 在P ...
- 【PHP7源码分析】PHP7到底有多快,基准测试与特性分析告诉你
顺风车运营研发团队 王坤 发表至21CTO公众号(https://mp.weixin.qq.com/s/ph...) PHP是一种跨平台开源语言,也是迄今为止最流行的Web开发语言,全球有超过80%的 ...
- php7协程通信使用,PHP7下的协程实现
原标题:PHP7下的协程实现 什么是协程 先搞清楚,什么是协程. 你可能已经听过『进程』和『线程』这两个概念. 进程就是二进制可执行文件在计算机内存里的一个运行实例,就好比你的.exe文件是个类,进程 ...
- thinkphp3.1迁移php7,ThinkPHP3.1迁移到PHP7的注意事项
ThinkPHP3.1迁移到PHP7的注意事项 2018.10.31 3723 小平 ThinkPHP3.1迁移到PHP7的注意事项 最近项目从PHP5.5升级到了PHP7.0,框架是ThinkPHP ...
- linux php 升级5.3,Linux php5.2.10升级到PHP5.3.29
成都这边的程序员要求把PHP从5.2.10版本升级到5.3.29版本. #cd /Data/App_php/ #wget http://cn2.php.net/get/php-5.3.29.tar.g ...
最新文章
- 工作几年了,API 网关还不懂?
- Servlet学习DAY_02:重定向/ 文件上传/ Cookie和Session/ 导入一个工程 / 配置欢迎页面 / 同步请求和异步请求/JSON和AJax介绍 /过滤器
- opencv使用问题总结
- 波卡链Substrate (7)Grandpa协议一“概念说明”
- 在Linux上编写并运行Java文件
- Oracle B-Tree Index 原理
- html文件下的flag,推荐一个SAM文件中flag含义解释工具
- Postman用法简介-Http请求模拟工具
- 区块链教程(三):Solidity编程基础
- 传递function_Excel VBA解读(132): 调用Function过程的4种方式
- 网站服务器需要定期重启吗,数据库服务器需要定期重启吗
- SQLServer 删除表中重复数据(除ID不同的)
- 51单片机原理以及接口技术(四)--80C51的程序设计
- 视频编解码发展历程(从AVC到HEVC再到VVC)(一)
- 高薪物联网职业生涯所需的十大技能(转)
- 如何获取OpenAI API Key
- web的标准网页设计与php课后,web网页设计尺寸规范
- oracle安装缺少依赖包,ORACLE 安装提示缺少依赖包
- 春花秋月何时了,互联网广告系统知多少?
- Oracle 临时表、数据闪回、查询被锁表、系统常用表、及常用操作