php方法参数类型提示带问号(?type)

时间:2018-02-20 09:11:25

标签: php

我只是在方法类型提示中使用问号的php(symfony / laravel)代码感觉到了:

public function functionName(?int $arg = 0)

在其他情况下,?type 不是最后一个,但我没有找到任何没有默认值的。

问题是,我找不到任何关于此的信息,我查了一下:

与7.2相同,但由于代码只需要7.1,所以看起来很正常。

我也用谷歌搜索,并在这里搜索,但要么没有记录,要么问题主题是打败搜索引擎。

所以我现在感觉有点愚蠢,如果有人能够在方法签名参数中对这个问号的含义进行启发,我将非常感激。

由于

3 个答案:

答案 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) 之间的区别:

  1. 没有传递参数
  2. 参数是 null

您可以调用 testFnc3() 但不能调用 testFnc4(),因为它没有声明默认值

您必须调用 testFnc4(null)

所以 testFnc4(?string $param) 允许 $paramnull,但必须提供这样的参数。

答案 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();