我只是在方法类型提示中使用问号的php(symfony / laravel)代码感觉到了:
public function functionName(?int $arg = 0)
在其他情况下,?type 不是最后一个,但我没有找到任何没有默认值的。
问题是,我找不到任何关于此的信息,我查了一下:
与7.2相同,但由于代码只需要7.1,所以看起来很正常。
我也用谷歌搜索,并在这里搜索,但要么没有记录,要么问题主题是打败搜索引擎。
所以我现在感觉有点愚蠢,如果有人能够在方法签名参数中对这个问号的含义进行启发,我将非常感激。
由于
答案 0 :(得分:12)
这是php7.1中的新功能
http://php.net/manual/en/migration71.new-features.php
问号表示类型提示参数(或返回值)也可以为空。
因此在您的示例中,$ arg可以为null或任何整数。
答案 1 :(得分:2)
考虑以下功能:
<?php
function testFnc1(string $param)
{
var_dump($param);
}
function testFnc2(string $param = 'some string')
{
var_dump($param);
}
function testFnc3(string $param = null)
{
var_dump($param);
}
function testFnc4(?string $param)
{
var_dump($param);
}
function testFnc5(?string $param = 'some string')
{
var_dump($param);
}
function testFnc6(?string $param = null)
{
var_dump($param);
}
现在我们用不同的值测试函数。
fnc | 没有争论 | 空 | '' | '其他字符串' |
---|---|---|---|---|
1 | 致命错误未捕获的 ArgumentCountError | 致命错误未捕获的类型错误:传递给 testFnc1() 的参数 1 必须是字符串类型,给定空值 | string(0) "" | string(12) "其他字符串" |
2 | string(11) "一些字符串" | 致命错误未捕获的类型错误:传递给 testFnc2() 的参数 1 必须是字符串类型,给定为空 | string(0) "" | string(12) "其他字符串" |
3 | NULL | NULL | string(0) "" | string(12) "其他字符串" |
4 | 致命错误未捕获的 ArgumentCountError | NULL | string(0) "" | string(12) "其他字符串" |
5 | string(11) "一些字符串" | NULL | string(0) "" | string(12) "其他字符串" |
6 | NULL | NULL | string(0) "" | string(12) "其他字符串" |
注意 testFnc3(string $param = null)
和 testFnc4(?string $param)
之间的区别:
null
您可以调用 testFnc3()
但不能调用 testFnc4()
,因为它没有声明默认值。
您必须调用 testFnc4(null)
。
所以 testFnc4(?string $param)
允许 $param
为 null
,但必须提供这样的参数。
答案 2 :(得分:1)
只是要添加到先前答案中的注释-它必须为null
或具有指定类型的值,即-您不能只是忽略它-请看一个示例:
class TestClass {
public function fetch(?array $extensions)
{
//...
}
}
现在,如果您致电
(new TestClass)->fetch();
这将抛出
ArgumentCountError:函数fetch()的参数太少了
要使其在不传递$extensions
数组的情况下工作,您必须以null
作为参数来调用
(new TestClass)->fetch(null);
在以下情况下效果最好:将初始设置为null
的参数传递给另一种处理方法,即
class TestClass {
public function fetch(array $extensions = null)
{
//...
$this->filter($extensions);
}
private function filter(?array $extensions)
{
//...
}
}
现在您可以在不带参数的情况下调用fetch
方法
(new TestClass)->fetch();