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.60 s user 0.05 s system 98 % cpu 0.667 total ? time /usr/local/php7/bin/php test.php /usr/local/php7/bin/php test.php 0.05 s user 0.02 s 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 [ 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 [ 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 echo 1 <=> 1 ; echo 1 <=> 2 ; echo 2 <=> 1 ; echo 1.5 <=> 1.5 ; echo 1.5 <=> 2.5 ; echo 2.5 <=> 1.5 ; echo "a" <=> "a" ; echo "a" <=> "b" ; echo "b" <=> "a" ; ?>
5、通过define()定义常量数组
1 2 3 4 5 6 7 <?php define ('ANIMALS' , ['dog' , 'cat' , 'bird' ]); echo ANIMALS[1 ]; ?>
6、匿名类
现在支持通过new class 来实例化一个匿名类,这可以用来