截止到目前为止,PHP官方已经发布了PHP7的RC5版本,预计在11月份左右会发布第一个正式版本!现在来说PHP7的重大特性肯定已经是定型了,不会再有什么变动了。后续一些版本的迭代主要也就是修修bug,优化之类的。下面就来说话我们一直期待的PHP7会有那些主要的变化了。。。
新特性预览
移除的一些特性
1.移除一些旧的扩展,被移迁移到了PECL(例如:MysqL) 2.移除SAPIs的支持 3.PHP”这样的标签被移除了 4.16进制的字符串转换被废除了
5.HTTP_RAW_POST_DATA移除了(可以使用PHP://input替代) 6.静态函数里面不再支持通过一个不兼容的$this调用一个非静态的函数了 $o = & new className{},不再支持这样的写法 7.PHP.ini文件移除了#作为注释,统一用;去注释
一些行为的改变
不在支持函数定义同名参数 类型的同名构造函数不推荐使用了(目前没有移除,后续会移除) String、int、float等这些关键字不能被作为类名使用了 func_get_args()获取的是当前变量的值
test(1)
//PHP5
int(1)
//PHP7
int(2)
下面就挑选了一些主要的、核心的、对我们PHPer来说比较重要的特性介绍一下
PHP NG
新的PHP引擎优化了很多地方,也正式因为如此,才使得PHP7相对于PHP5性能有了接近两倍的提升!
ZVAL结构的重构
左边是PHP5的zval(24字节),右边是PHP7的zval(16字节);
可以看出来PHP7的zval要比PHP5还要复杂,但是却能从24个字节下降到16个字节,为什呢?
在C语言中struct的每一个成员变量要各自占据一块独立的内存空间,而union里的成员变量是共用一块内存空间(PHP7中大量使用union替换了struct)。因此,虽然成员变量看起来多了不少,但是实际占据的内存空间有很多都是公用的却下降了。
我们PHP程序中使用最多、最有用、最方便、最灵活的就是数组了,而PHP5它的底层就是HashTable实现的,PHP7使用了新的Zend Array类型,性能和访问速度上都有了大幅度提升!
一些非常常用,开销不大的的函数直接变成了引擎支持的opcode
使用了新的内存分配,管理方式,减少了内存的浪费
核心排序zend_sort的优化
小于16个元素的使用选择排序,大于16个按照16个为单位去分割,分别使用选择排序,然后再全部合起来使用快速排序。排序较之前相比,内部元素由非稳定排序变成稳定排序,减少元素的交换次数,减少对内存的操作次数,性能提升40%
抽象语法树
假如现在我们有这样的需求,要对PHP源文件就行语法检测,实现编码规范。PHP5之前的话,没有AST,直接从parser就生成了opcodes!就需要借助一些外部的PHP语法解析器来实现;而PHP7增加了AST,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的AST结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。
64位的INT支持
支持存储大于2GB的字符串 支持上传大小大于2GB的文件 保证字符串在所有平台上【64位】都是64bit 统一的语法变量
foreach循环的改进
$a = array(1,3);$b=&$a;foreach ($a as $v){var_dump(current($a));}
int(2)
int(3)
bool(false)
$a = array(1,3);$b=$a;foreach ($a as $v){var_dump(current($a));}
int(1)
int(1)
int(1)
//PHP7:不再操作数据的内部指针了
$a = array(1,3);foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(1)
$a = array(1,3);$b=&$a;foreach ($a as $v){var_dump(current($a))
int(1)
int(1)
int(1)
$a = array(1,3);$b=$a;foreach ($a as $v){var_dump(current($a))}
int(1)
int(1)
int(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}";//新
返回类型的声明
//PHP5
PHP Parse error: parse error,expecting '{'...
//PHP7
Fatal error:Uncaught TypeError: Return value of getInt() must be of the type integer,string returned
标量类型的声明
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…
核心错误可以通过异常捕获了
//这里用PHP7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。
Exception: Call to undefined function non_exists_func()
上下问敏感的词法分析
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的初步了解说完了,其中肯定有很多不对的、低级的错误,希望各位兄弟及时指正,我好改一下,做个笔记!嘿嘿!