Тип аргумента метода php, указывающий с вопросительным знаком (? type)
Я только что почувствовал фрагменты кода php (symfony/laravel), используя вопросительный знак в подсказках типа метода:
public function functionName(?int $arg = 0)
В других случаях тип? Не был последним, но я не нашел ни одного из них без значения по умолчанию.
Проблема в том, что я не могу найти информацию об этом, и я проверил:
И то же самое с 7.2, но так как код требует только 7.1, это выглядит довольно нормально.
Я также гуглил и искал здесь, но либо это не задокументировано, либо тема с вопросительными знаками побеждает поисковые системы.
Так что теперь я чувствую себя немного глупо, и я был бы очень признателен, если бы кто-то мог просветить меня о значении этого знака вопроса в аргументах сигнатур методов.
Спасибо
Ответы
Ответ 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();