Тип аргумента метода php, намекающий на вопросительный знак (?type)
Я только что почувствовал фрагменты кода php (symfony/laravel), используя вопросительный знак в подсказках типа метода:
public function functionName(?int $arg = 0)
В других случаях тип? Не был последним, но я не нашел ни одного из них без значения по умолчанию.
Проблема в том, что я не могу найти информацию об этом, и я проверил:
- здесь: http://php.net/manual/en/migration70.new-features.php
- и здесь: http://php.net/manual/en/migration71.new-features.php
- и здесь: http://php.net/manual/en/functions.arguments.php
И то же самое с 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)
и когда:
- аргумент не передан
- аргумент
Вы можете позвонить
testFnc3()
но нет
testFnc4()
поскольку он не объявляет значение по умолчанию .
Вы должны позвонить
testFnc4(null)
.
Так
testFnc4(?string $param)
позволяет
$param
быть
null
, но такой параметр ДОЛЖЕН быть предоставлен.