1、 速度快了,快了2倍多
2、可以给参数设置类型声明了,并且可以强制返回类型
3、null 合并运算符
1 2 3 4 |
//以前三元运算符,user如果有,返回user,没有返回null $username = isset($_GET['user']) ? $_GET['user']:'null'; //现在用?? $username = $_GET['user'] ?? 'null'; |
4、太空船操作符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
<?php // 整数 echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1 // 浮点数 echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // 字符串 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1 ?> |
5、define允许定义常量数组
1 2 3 4 5 6 7 8 9 |
<?php define('ANIMALS', [ 'dog', 'cat', 'bird' ]); echo ANIMALS[1]; // 输出 "cat" ?> |
6、匿名类
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 |
<?php interface Logger { public function log(string $msg); } class Application { private $logger; public function getLogger(): Logger { return $this->logger; } public function setLogger(Logger $logger) { $this->logger = $logger; } } $app = new Application; $app->setLogger(new class implements Logger { public function log(string $msg) { echo $msg; } }); var_dump($app->getLogger()); ?> 以上例程会输出: object(class@anonymous)#2 (0) { } |
7、use分组命名空间
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?php // PHP 7 之前的代码 use some\namespace\ClassA; use some\namespace\ClassB; use some\namespace\ClassC as C; use function some\namespace\fn_a; use function some\namespace\fn_b; use function some\namespace\fn_c; use const some\namespace\ConstA; use const some\namespace\ConstB; use const some\namespace\ConstC; // PHP 7+ 及更高版本的代码 use some\namespace\{ClassA, ClassB, ClassC as C}; use function some\namespace\{fn_a, fn_b, fn_c}; use const some\namespace\{ConstA, ConstB, ConstC}; ?> |
8、intdiv()
1 2 3 4 5 6 7 8 9 |
新加的函数 intdiv() 用来进行 整数的除法运算。 <?php var_dump(intdiv(10, 3)); ?> 以上例程会输出: int(3) |
9、throwable接口
在php7之前,如果代码中有语法错误或者fatal error时,程序会直接报错退出,php7中实现了全局throwable接口,原来的Exception和部分Error实现了该接口
10、可为空类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php function testReturn(): ?string { return 'elePHPant'; } var_dump(testReturn()); function testReturn(): ?string { return null; } var_dump(testReturn()); function test(?string $name) { var_dump($name); } test('elePHPant'); test(null); test(); |
以上例程会输出:
1 2 3 4 5 |
string(10) "elePHPant" NULL string(10) "elePHPant" NULL Uncaught Error: Too few arguments to function test(), 0 passed in... |
11、 void函数
一个新的返回值类型void被引入。 返回值声明为 void 类型的方法要么干脆省去 return 语句,要么使用一个空的 return 语句。 对于 void 函数来说,NULL
不是一个合法的返回值。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php function swap(&$left, &$right) : void { if ($left === $right) { return; } $tmp = $left; $left = $right; $right = $tmp; } $a = 1; $b = 2; var_dump(swap($a, $b), $a, $b); 以上例程会输出: null int(2) int(1) |
12、Closure::call()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
在php7之前,当动态的给一个对象添加方法时,可以通过Closure来复制一个闭包对象,并绑定到一个$this对象和类作用域 class People{ private $age=10; } $f=function(){ return $this->age+1; }; $p=$f->bindTo(new People,'People'); echo $p(); 在php7可通过call来暂时绑定一个闭包对象到$this对象并调用它 class People{ private $age=10; } $f=function(){ return $this->age+1; }; echo $f->call(new People); |
13、list方括号写法
1 2 3 4 5 |
$a=[1,2,3]; list($n1,$n2,$n3)=$a; //php7 [$n1,$n2,$n3]=[4,5,6]; //[]并不是数组,而是list的简略形式 |
14、foreach遍历数组不再修改内部指针
1 2 3 4 5 |
$arr=[1,2,3,4,5,6]; foreach ($arr as $key => $value) { if($value ==2) break; } echo current($arr);//php7下 1,php5下 3 |