Тип аргумента метода php, намекающий на вопросительный знак (?type)

Я только что почувствовал фрагменты кода php (symfony/laravel), используя вопросительный знак в подсказках типа метода:

public function functionName(?int $arg = 0)

В других случаях тип? Не был последним, но я не нашел ни одного из них без значения по умолчанию.

Проблема в том, что я не могу найти информацию об этом, и я проверил:

И то же самое с 7.2, но так как код требует только 7.1, это выглядит довольно нормально.

Я также гуглил и искал здесь, но либо это не задокументировано, либо тема с вопросительными знаками побеждает поисковые системы.

Так что теперь я чувствую себя немного тупым, и я был бы очень признателен, если бы кто-то мог просветить меня о значении этого знака вопроса в аргументах сигнатур методов.

Спасибо

3 ответа

Это новая функция в php7.1

http://php.net/manual/en/migration71.new-features.php

Знак вопроса означает, что параметр подсказки типа (или возвращаемое значение) также может иметь значение null.

Так что в вашем примере $arg может быть нулевым или любым целым числом.

Просто примечание, чтобы добавить к предыдущим ответам - это должно быть либо 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();

Рассмотрим следующие функции:

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

Теперь протестируем функции с разными значениями.

Обратите внимание на разницу между testFnc3(string $param = null) и когда:

  1. аргумент не передан
  2. аргумент

Вы можете позвонить testFnc3() но нет testFnc4()поскольку он не объявляет значение по умолчанию .

Вы должны позвонить testFnc4(null).

Так testFnc4(?string $param) позволяет $param быть null, но такой параметр ДОЛЖЕН быть предоставлен.

Другие вопросы по тегам