官方的文档显示,PHP7可以达到PHP5.x版本两倍的性能。同时还提供了很多其他语言流行的语法格式。另外其PHP7的兼容性也是非常好的。
函数参数支持标量类型声明
在PHP5中,可以将函数参数指定为类名、接口名、数组和回调类型中的一种,但是无法将类型指定为标量。PHP7中新增了对函数参数声明为四种标量类型的支持,即可以指定参数类型为整型(int)、浮点型(float)、字符串(string)以及布尔型(bool)。1
2
3
4
5
6
//指定函数参数必须为字符串
function checkOpenid(string $sOpenid)
{
return preg_match('/^[a-zA-Z_-]{28}$/', $sOpenid);
}新增函数返回类型声明
PHP7新增了对函数返回类型声明的支持,支持的类型与参数类型相同(在PHP7.1中支持返回void类型)1
2
3
4
5
6
//指定函数返回值必须为整型
function checkOpenid(string $sOpenid): int
{
return preg_match('/^[a-zA-Z_-]{28}$/', $sOpenid);
}define定义常量数组
PHP5.6及以后版本中可以通过const关键字来定义常量数组,PHP7中新增可以通过define定义常量数组功能。1
2
3
4
5
6
7
//php5.6中通过const定义常量数组
const FRUITS = ['peach', 'banana', 'pear', 'orange'];
//php7 中通过define定义常量数组数组
define('FRUITS1', ['peach','banana','pear','orange']);生成器的返回值和引入其他生成器
在PHP5.5引入生成器的概念。生成器函数每执行一次就得到一个yield标识的值。在PHP7中,当生成器迭代完成后,可以获取该生成器函数的返回值。通过Generator::getReturn()得到。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function generator() {
yield 1;
yield 2;
yield 3;
return "a";
}
$generatorClass = ("generator")();
foreach ($generatorClass as $val) {
echo $val.” “;
}
echo $generatorClass->getReturn();
//运行结果:1 2 3 a
在生成器中可以引入另一个或几个生成器,只需要写yield from functionName11
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function generator1(){
yield 1;
yield 2;
yield from generator2();
yield from generator3();
}
function generator2(){
yield 3;
yield 4;
}
function generator3(){
yield 5;
yield 6;
}
foreach (generator1() as $val){
echo $val, " ";
}
//输出:1 2 3 4 5 6
NULL合并运算符
后端CGI在接收用户传入的数据时通常会先判断变量是否存在,如果存在获取对应的值,如果不存在,在设置一个默认值或者报错处理。这里就会用到 三元运算符和isset。在PHP7中新增了一个语法糖??。如果第一个操作数存在且不为null则返回第一个操作数的值,否则返回第二个操作数的值。例如:1
2
3
4
5
6
7
8
//获取用户openid.先从$_GET中获取,如果没有从$_POST中获取,如果还是不存在,就默认空
//PHP7之前的写法
$sOpenid = isset($_GET['iuin']) ? $_GET['iuin'] : (isset($_POST['iuin']) ? $_POST['iuin'] : '');
//php7中新增的??语法糖
$sOpenid = $_GET['iuin'] ?? $_POST['iuin'] ?? '';组合比较符
该操作符也称为太空船操作符,用于对2个表达式进行比较并返回比较结果。使用语法:$exp1 <=> $exp2。如果$exp1小于$exp2返回-1,$exp1等于$exp2返回0,$exp1大于$exp2返回1。比较的原则是沿用 PHP 的常规比较规则进行的。1
2
3
4
5
6
7
8
9
echo 10 <=> 9;
echo 10 <=> 20;
echo 10 <=> '10';
#输出结果
# 1
# -1
# 0Closure::call()
Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它1
2
3
4
5
6
7
8
9
10
11
12
class Test{public $name = "lixuan";}
//PHP7和PHP5.6都可以
$getNameFunc = function(){return $this->name;};
$name = $getNameFunc->bindTo(new Test, 'Test');
echo $name();
//PHP7可以,PHP5.6报错
$getX = function() {return $this->name;};
echo $getX->call(new Test);foreach不再改变内部数组指针
在PHP7之前,当数组通过 foreach 迭代时,数组指针会移动。现在开始,不再如此,见下面代码。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
/*
PHP5输出:
int(1)
int(2)
bool(false)
PHP7输出:
int(0)
int(0)
int(0)
*/