截止到目前为止,php官方已经发布了php7的rc5版本,预计在11月份左右会发布第一个正式版本!现在来说php7的重大特性肯定已经是定型了,不会再有什么变动了。后续一些版本的迭代主要也就是修修bug,优化之类的。下面就来说话我们一直期待的php7会有那些主要的变化了。。。
新特性预览
1
2
3
4
5
6
7
8
9
10
11
|
zend引擎升级到zend engine 3,也就是所谓的php ng
增加抽象语法树,使编译更加科学
64位的int支持
统一的变量语法
原声的tls - 对扩展开发有意义
一致性 foreach 循环的改进
新增 <=>、**、?? 、\u{xxxx}操作符
增加了返回类型的声明
增加了标量类型的声明
核心错误可以通过异常捕获了
增加了上下文敏感的词法分析
|
移除的一些特性
1.移除一些旧的扩展,被移迁移到了pecl(例如:mysql)
2.移除sapis的支持
3.<?和<? language=“php”这样的标签被移除了
4.16进制的字符串转换被废除了
1
2
3
4
5
|
//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()获取的是当前变量的值
1
2
3
4
5
6
7
8
9
10
11
12
|
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结构的重构
左边是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
1
2
3
4
|
call_user_function(_array) => zend_init_user_call
is_int /string/ array /* => zend_type_check
strlen => zend_strlen
defined => zend+defined
|
使用了新的内存分配,管理方式,减少了内存的浪费
核心排序zend_sort的优化
1
2
3
4
5
|
//php5 - 快速排序(非稳定排序)
array (1 => 0, 0 => 0)
//php7 - 快速排序+选择排序(稳定排序)
array (0 => 0, 1 => 0)
|
小于16个元素的使用选择排序,大于16个按照16个为单位去分割,分别使用选择排序,然后再全部合起来使用快速排序。排序较之前相比,内部元素由非稳定排序变成稳定排序,减少元素的交换次数,减少对内存的操作次数,性能提升40%
抽象语法树
假如现在我们有这样的需求,要对php源文件就行语法检测,实现编码规范。php5之前的话,没有ast,直接从parser就生成了opcodes!就需要借助一些外部的php语法解析器来实现;而php7增加了ast,我们可以自己去实现这样一个扩展,利用扩展提供的函数可以直接获取文件对应的的ast结构,而这样的结构正是我们可以识别的,所以就可以在这个基础上去做一些优化和判断了。
64位的int支持
支持存储大于2gb的字符串
支持上传大小大于2gb的文件
保证字符串在所有平台上【64位】都是64bit
统一的语法变量
1
2
3
4
5
6
7
|
$ $foo [ 'bar' ][ 'baz' ]
//php5
($ $foo )[‘bar '][' baz']
//php7: 遵循从左到右的原则
${ $foo [‘bar '][' baz']}
|
foreach循环的改进
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
//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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
//<=> - 比较两个数的大小【-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}" ; //新
|
返回类型的声明
1
2
3
4
5
6
7
8
9
10
11
|
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
|
标量类型的声明
1
2
3
4
5
6
7
8
9
10
11
|
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…
|
核心错误可以通过异常捕获了
1
2
3
4
5
6
7
8
|
try {
non_exists_func();
} catch (engineexception $e ) {
echo “exception: { $e ->getmessage();}\n”;
}
//这里用php7试了一下还是没法捕获,但是看鸟哥介绍说是可行的。。。
#exception: call to undefined function non_exists_func()
|
上下问敏感的词法分析
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//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的初步了解说完了,其中肯定有很多不对的、低级的错误,希望各位兄弟及时指正,我好改一下,做个笔记!嘿嘿!