PHP7和PHP5的区别,给大家详细聊聊【PHP】

原创
2021/01/26 17:25
阅读数 1.2K

一、前言

最近和几个来应聘的中工聊了聊,基本都会问他们一些7和5的去区别

虽然7升级来已经很久了,可能大家项目中都已经在使用,但是一些面试者的回答让我不算满意

他们大概分为以下三种

1.直接说不知道的,会使用,没研究过。最多也说一句,性能提升,这种你就跟说“你是个好人”是一样的敷衍

2.了解一些,能说一些具体写法的不同,大概性能提升的原理,但是看样子也是看了看网上文章,不算精通

3.极少数能深刻解析的,而且参数了项目的升级,以及能够再次去钻研和分析的

二、说说面试官想听到什么

首先,是要说明性能提升的,然后可以补充下什么导致的提升,然后在哪方面有提升

其次,可以具体举例一些写法的不同,无论你是看博客来的,还是真正实践开发而了解的

最后,如果你参数了项目重构和升级,聊聊你在项目中的定位和做了哪些事情

能回答出以上三点的,其实就不错了,因为你不是初学者,不会再问问a++和++a的区别了,

有些架构的东西你要学会而且你要学习怎么表达

三、说说有哪些区别

1.性能为什么提升?

变量存储字节减小,减少内存占用,提升变量操作速度

改善数组结构,数组元素和hash映射表被分配在同一块内存里,降低了内存占用、提升了 cpu 缓存命中率

改进了函数的调用机制,通过优化参数传递的环节,减少了一些指令,提高执行效率

通过宏定义和内联函数(inline),让编译器提前完成部分工作

比如:数组结构的改变

7为字符串单独创建了新的结构体类型`zend_string`
struct _zend_string {
	zend_refcounted gc;
	zend_ulong		h;
	size_t			len;
	char			val[1]
}
除了char *指针和长度,增加了一个h存储hash值,数组的键名查找不需要反复计算hash值.
以前,虽然HashTable数据结构的查找时间复杂度是O(1),但是每次键名的字符串都需要hash函数
计算成hash整数,但是实际情况是,php程序运行起来后,key几乎是不变的
所以7中直接的把hash值存储起来,节省大量的cpu计算时间,优化性能

2.具体哪些写法的不同

(1)php7移除了一些拓展,比如mysql、 ereg等

(2)session_start()可以定义数组

(3)可以导入同一个namespace下的类简写 use some\namespace\{ClassA, ClassB, ClassC as C};

(4)有了伪随机数产生器:random_bytes() - 加密生存被保护的伪随机字符串。 random_int() - 加密生存被保护的伪随机整数。

(5)使用 define 函数来定义数组 define('sites', [ 'Google', 'Jser', 'Taobao' ]);

(6)php标量类型和返回类型声明 ,开启:

declare(strict_types=1)

(7)三元运算符? : 的 ?? 简写

三、小结

鸟哥的PPT里放出过一组对比数据,就是WordPress在PHP5.6执行100次会产生70亿次的CPU指令执行数目,而在PHP7中只需要25亿次,减少64.2%,这是一个令人震撼的数据。

在鸟哥的整个分享中,给我最深刻的一个观点是:要注意细节,很多个细小的优化,一点点持续地积累,积少成多,最终汇聚为惊艳的成果。为山九仞,岂一日之功,我想大概也是这个道理。

毫无疑问,PHP7在性能方面实现跨越式的提升,如果能够将这些成果应用在PHP的Web系统中,也许我们只需要更少的机器,就可以支撑起更高请求量的服务。

PHP7正式版的发布,令人充满无限憧憬。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
1
分享
返回顶部
顶部