PHP7修复了大量BUG,新增了功能和语法糖。这些改动涉及到了核心包、GD库、PDO、ZIP、ZLIB等熟悉和不熟悉的核心功能与扩展包。

PHP7移除了已经被废弃的函数,如mysql_系列函数在PHP5.5被废弃,在PHP7被删除。

PHP7的性能高于HHVM。并且是PHP5.6的两倍。

http://php.net/archive/2015.php#id2015-12-03-1

PHP7特性

2015年12月3号, PHP开发团队宣布PHP 7.0.0即将上市。本次发布标志着新的重要的PHP 7系列的开始。

PHP 7.0.0附带了一个新版本的Zend引擎中,无数的改进和新功能,如

性能改善:PHP 7高达两倍快的PHP 5.6

显著减少内存使用

抽象语法树

一致的64位支持

改进的异常层次结构

许多转化为异常致命错误

安全随机数发生器

删除旧的和不支持的SAPIs和扩展

空合并运算符(?)

返回和标量类型声明

匿名类

零成本断言

这是下一个主要版本的PHP。它的发布是近两年的发展征程的结果。这是核心团队的一个非常特殊的成就。而且,它是许多活跃的社区成员难以置信努力的结果。事实上,这是一个新的PHP一代的崛起与巨大潜力。

恭喜大家,这是一个壮观的PHP的世界!

感谢感谢所有的贡献者和支持者!

一、PHP7的前世今生

以下摘自并修改与鸟哥微信
`
PHP7开始于2014年春节,因为基于PHP-5.5的Opcache JIT因为无法得到期望而搁置了,并且让鸟哥等人认识到, 基础部分还不够好, 并不能很好的支持JIT, 所以开始了重构项目,希望通过得到30%以上的提升。随后发现性能提升比我们想象的还要大,于是定名为PHP NG项目。

经过发起投票, 绝大部分人都支持了PHP NG项目, 并决定以PHP NG为基础, 开发新版的PHP。社区曾开发过PHP6,后来PHP6的特性在PHP5.5,5.6等版本都逐渐实现,所以PHP6被搁置。经过社区投票,新项目命名为PHP7。

在这近两年的时间里,各种新特性的加入, 性能的持续提升,很多以前不合理的地方改进等等, 都加入到了PHP7, 让PHP7越来越丰满. 从最底层的ZVAL的改变, 到标量类型提示, 从最初的30%的性能提升, 到现在超过100%的性能飞跃, 每一处变化都让人值得期待. 然后经过几次不情愿的跳票, 终于, 到今天, 这一切都将呈现于你面前。 `

二、安装

安装:我们编译了核心包以及PDO,GD,mysqli,Zip等

1
2
3
4
5
6
7
8
9
10

./configure --prefix=/usr/local/php7 --enable-fpm --with-zlib --enable-mbstring --with-openssl
--with-mysql --with-mysqli --with-mysql-sock --with-gd --enable-gd-native-ttf --enable-pdo
--with-pdo-mysql --with-gettext --with-curl --with-pdo-mysql --enable-sockets --enable-bcmath
--enable-xml --with-bz2 --enable-zip

make

sudo make install

三、测试

测试版本:

旧版PHP 5.5.29,新版 PHP 7.0.0

1、测试用例一:

生成五十万个数组,并查询五十万次key是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$a = array();

for($i=0;$i<500000;$i++){

$a[$i] = $i;

}

foreach($a as $i)

{

array_key_exists($i, $a);

}

?>

测试结果如下:

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

? time php test.php

php test.php

0.60s user

0.05s system

98% cpu

0.667 total

? time /usr/local/php7/bin/php test.php

/usr/local/php7/bin/php test.php

0.05s user

0.02s system

92% cpu

0.073 total

PHP7速度是PHP5.5的9倍

2、测试用例二:

生成五十万个数组,并查询五十万次value是否存在

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$a = array();

for($i=0;$i<10000;$i++){

$a[$i] = $i;

}

foreach($a as $i)

{

array_search($i, $a);

}

?>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
?  time php test.php

php test.php

0.79s user

0.01s system

99% cpu

0.809 total

? time /usr/local/php7/bin/php test.php

/usr/local/php7/bin/php test.php

0.08s user

0.01s system

97% cpu

0.091 total

PHP7速度是PHP5.5的8.7倍

3、测试用例三:

示例与结果摘自鸟哥博客。以Wordpress为基础,测试PHP7和HHVM3.2。用Apache的ab测试工具。100个并发, 10000个请求。测试前都会用100个请求预热。

PHP7结果如下:

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Concurrency Level:      100

Time taken for tests: 38.726 seconds

Complete requests: 10000

Failed requests: 0

Write errors: 0

Total transferred: 89290000 bytes

HTML transferred: 86900000 bytes

Requests per second: 258.22 [#/sec] (mean)

Time per request: 387.260 [ms] (mean)

Time per request: 3.873 [ms] (mean, across all concurrent requests)

Transfer rate: 2251.64 [Kbytes/sec] received

HHVM-3.2

HHVM结果如下:

Document Path: /wordpress/

Document Length: 8690 bytes

Concurrency Level: 100

Time taken for tests: 43.296 seconds

Complete requests: 10000

Failed requests: 0

Write errors: 0

Total transferred: 89260000 bytes

HTML transferred: 86900000 bytes

Requests per second: 230.97 [#/sec] (mean)

Time per request: 432.957 [ms] (mean)

Time per request: 4.330 [ms] (mean, across all concurrent requests)

Transfer rate: 2013.31 [Kbytes/sec] received

PHP7 – 258.22 QPS HHVM – 230.97 QPS

四、新特性

1、标量类型声明

有两种模式: 强制 (默认) 和 严格模式。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如Int,String等是不能够被申明的

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function check(int $bool){

var_dump($bool);

}

check(1);

check(true);

?>

若无强制类型转换,会输入int(1)bool(true)。转换后会输出bool(true) bool(true)

2、返回值类型声明

PHP 7 增加了对返回类型声明的支持。返回类型声明指明了函数返回值的类型。可用的类型与参数声明中可用的类型相同。

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
<?php

function arraysSum(array ...$arrays): array

{

return array_map(function(array $array): int {

return array_sum($array);

}, $arrays);

}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

以上例程会输出:

Array

(

[0] => 6

[1] => 15

[2] => 24

)

3、null合并运算符

项目中存在大量同时使用三元表达式和 isset()的情况,新增了null合并运算符 (??) 这个语法糖。如果变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

旧版:isset($_GET[‘id']) ? $_GET[id] : err;

新版:$_GET['id'] ?? 'err';

4、太空船操作符(组合比较符)

太空船操作符用于比较两个表达式。当$a大于、等于或小于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

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
<?php

// Integers

echo 1 <=> 1; // 0

echo 1 <=> 2; // -1

echo 2 <=> 1; // 1

// Floats

echo 1.5 <=> 1.5; // 0

echo 1.5 <=> 2.5; // -1

echo 2.5 <=> 1.5; // 1

// Strings

echo "a" <=> "a"; // 0

echo "a" <=> "b"; // -1

echo "b" <=> "a"; // 1

?>

5、通过define()定义常量数组

1
2
3
4
5
6
7
<?php

define('ANIMALS', ['dog', 'cat', 'bird']);

echo ANIMALS[1]; // outputs "cat"

?>

6、匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来