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

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

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

public function functionName(?int $arg = 0)

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

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

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

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

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

Спасибо

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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