标量类型声明

两种标量类型声明模式:强制模式和严格严格模式.

1
2
3
4
5
6
7
8
9
<?php
declare(strict_types = 1); //严格模式
function add(int $a,int $b)
{
return $a+$b;
}
var_dump(1,2);
var_dump(1.1, 2); // 开启严格模式此处报错

返回类型声明

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
declare(strict_types = 1); // 同理声明严格模式后必须遵循传参类型转换
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,
)

null合并运算符

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

1
2
3
4
5
6
7
8
<?php
$username = $_GET['username'] ?? 'nobody';
var_dump($username);// nobody
//相当于
$username2 = $_GET['username'] ? $_GET['username'] : 'nobody';
var_dump($username2);// nobody
$username3 = $_GET['username'] ?? $_GET['username'] ?? 'nobody';
var_dump($username3);// nobody

通过define()定义常量数组

Array数组的常量可以通过define来定义,在之前的版本只能通过const定义.

1
2
3
4
5
6
7
8
<?php
define('ANIMALS', [
'dog',
'cat',
'bird',
]);
echo ANIMALS[1]; // cat

匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义

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
<?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());