可为空(Nullable)类型
官方解释:类型现在允许为空,当启用这个特性时,传入的参数或者函数返回的结果要么是给定的类型,要么是null。可以通过在类型前面加上一个问号来使之成为可为空的。
大话解释:官方的中文翻译是有歧义的,经过测试正确的解释应该是:类型在7.0的时候,不能传入null值,也不能什么都不传,两种情况都会报错,7.1中加上一个问号问号来使之可以传入为null的类型,但是什么值都不传的情况仍然会报错
同时适用于函数和对象的方法中

形参类型声明:

函数中,如下代码:

1
function test(string $name)
2
{
3
var_dump($name);
4
}
5
6
test('tpunt');
7
test(null); //此行会引发的错误
8
test(); //此行会引发的错误
Copied!

对象的方法中,如下代码:

1
class Tests
2
{
3
function test(string $name)
4
{
5
var_dump($name);
6
}
7
8
}
9
10
$test = new Tests();
11
$test->test('tpunt');
12
$test->test(null); //由此会行引发的错误
13
$test->test(); //由此会行引发的错误
Copied!
PHP7.0 中会报错.如下:
1
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type string, null given, called in .....
2
TypeError: Argument 1 passed to test() must be of the type string, null given, called in ....
Copied!
在PHP7.1当中只需要在类型前面加 ? 即可解决null 报错,什么值都不传的情况仍然会报错.
1
?string $name
Copied!
结果
1
test(); //此行仍然会引发的错误
2
--------------------------
3
Fatal error: Uncaught TypeError: Argument 1 passed to test() must be of the type string, null given, called in .....
4
TypeError: Argument 1 passed to test() must be of the type string, null given, called in ....
Copied!
进一步结果可以解决test()这种情况的报错,但是如果以上函数的参数定义为 ?Bar $bar = null 的形式,则第三种写法也是可行的。因为 = null实际上相当于 ? 的超集,对于可空类型的参数,可以设定 null 为默认值。
1
function test(?string $name = null)
2
{
3
var_dump($name);
4
}
5
6
test('tpunt');
7
test(null); // ok
8
test(); // ok
Copied!
以上代码即可解决.同样适用于对象的方法中的形参类型声明.

返回类型声明:

1
function answer1(): ?int {
2
return null; //ok
3
}
4
var_dump(answer1());
5
6
function answer2(): ?int {
7
return 42; // ok
8
}
9
var_dump(answer2());
10
11
function answer3(): ?int {
12
return ''; //由此会行引发的错误
13
}
14
var_dump(answer3());
Copied!
对象候总类方法的返回类型声明就不再举例了.