PHP7新增功能详解
标签(空格分隔): php
这一篇主要是来详细分析php7.0的新增功能。
一、性能与底层
PHP7速度是 PHP5.6 的两倍
php7 最显著的变化就是性能的极大提升,已接近Facebook开发的PHP执行引擎HHVM。在WordPress基准性能测试中,速度比5.6版本要快2~3倍,大大减少了内存占用。PHP7在语言上也有一些变化,比如添加返回类型声明、增加了一些新的保留关键字等。在安全方面,去除了PHP安全模式,添加魔术引号等。不仅如此,新版还支持64位,而且包含最新版Zend引擎。
测试一下
- 很简单的一个例子,生成一个 60 万元素的数组,通过查找key 的方式,来确定key是否存在。
<?php
$a = [];
for($i=0;$i<600000;$i++){
$a[$i] = $i;
}
foreach($a as $item) {
array_key_exists($item, $a);
}
我们分别在php5.6.11
和php7.0.4
来测试下性能。
php5.6.11
➜ time php 1.php
0.67s user 0.06s system 67% cpu 1.078 total
➜ time php 1.php
0.68s user 0.06s system 98% cpu 0.748 total
➜ time php 1.php
0.65s user 0.06s system 67% cpu 1.052 total
三次平均下来,大致是 user使用 0.65秒,system使用0.06秒,67%的cpu率。总共1秒左右。
再看php7的情况
➜ time /usr/local/opt/php70/bin/php 1.php
0.52s user 0.02s system 98% cpu 0.544 total
➜ time /usr/local/opt/php70/bin/php 1.php
0.49s user 0.02s system 99% cpu 0.513 total
➜ time /usr/local/opt/php70/bin/php 1.php
0.51s user 0.02s system 98% cpu 0.534 total
对比下来,user使用时间下降20%左右,system使用时间下降70%,cpu使用率更高高达98%。总体时间减少为。0.5秒。
这个例子看下来,效率提供了2倍。确实不错。
- 再看一个例子。同样也是生成一个 60 万元素的数组,查找 value是否存在。
<?php
$a = [];
for($i=0;$i<600000;$i++){
$a[$i] = $i;
}
foreach($a as $i) {
array_search($i, $a);
}
?>
先看php5.6.11
➜ testPHP time php 2.php
0.68s user 0.03s system 66% cpu 1.077 total
➜ testPHP time php 2.php
0.68s user 0.02s system 98% cpu 0.710 total
➜ testPHP time php 2.php
0.68s user 0.02s system 98% cpu 0.713 total
➜ testPHP time php 2.php
0.69s user 0.02s system 98% cpu 0.721 total
再接着看php7.0.4
➜ testPHP time /usr/local/opt/php70/bin/php 2.php
0.12s user 0.02s system 69% cpu 0.201 total
➜ testPHP time /usr/local/opt/php70/bin/php 2.php
0.11s user 0.01s system 97% cpu 0.131 total
➜ testPHP time /usr/local/opt/php70/bin/php 2.php
0.11s user 0.01s system 96% cpu 0.130 total
明显看出,快了6倍多。厉害。
二、新特性
1. 更多的标量类型声明
现在php的标量有两种模式: 强制
(默认) 和严格模式
。 现在可以使用下列类型参数(无论用强制模式还是严格模式): 字符串(string), 整数 (int), 浮点数 (float), 以及布尔值 (bool)。它们扩充了PHP5中引入的其他类型:类名,接口,数组和 回调类型。在旧版中,函数的参数申明只能是(Array $arr)、(CLassName $obj)等,基本类型比如Int,String等是不能够被申明的。
怎么理解呢?php7之前的版本,我们要想限定一个函数的参数的类型,只有array
或者class
2种。
php7之前:
class MyInfo
{
public $a = 123;
public function getInfo(array $a, $b)
{
var_dump($a, $b);
}
}
function getClass(MyInfo $a) {
var_dump($a->a);
}
我们想限定 getInfo
的第一个参数,必须是数组,所以,我们可以在参数$a
前加一个array
。来申明。
同样,我们想getClass
的参数,必须是一个类,所以我们就用这个类的className
前坠来申明,起到强制使用的目的。
php7之前,只有这2种标量可以使用。
我们来使用一下:
$info = new MyInfo();
$info->getInfo([1,2,3,4], 4);
我们按照规定的来,第一个参数,传数组,结果当然是正常打印:
➜ testPHP php 3.php
array(3) {
[0] =>
int(1)
[1] =>
int(2)
[2] =>
int(3)
}
int(4)
要是我们不安装规定来,就会报知名错误:
$info = new MyInfo();
$info->getInfo(122, 0);
报错:
PHP Catchable fatal error: Argument 1 passed to MyInfo::getInfo() must be of the type array, integer given, called in /Users/yangyi/www/testPHP/3.php on line 25 and defined in /Users/yangyi/www/testPHP/3.php on line 8
PHP Stack trace:
PHP 1. {main}() /Users/yangyi/www/testPHP/3.php:0
PHP 2. MyInfo->getInfo() /Users/yangyi/www/testPHP/3.php:25
使用类也一样:
$info = new MyInfo();
getClass($info);
输出结果:
➜ testPHP php 3.php
int(123)
同样,我们传入别的参数,就会报错:
getClass(123);
➜ testPHP php 3.php
PHP Catchable fatal error: Argument