Предположим, у меня есть метод / функция со следующей сигнатурой:
foo($bar = 0)
Внутри foo , как мне узнать, если $ bar был установлен или нет? isset всегда будет возвращать TRUE , поскольку $ bar назначается 0 , если ничего не передано в foo .
Проверка на 0 не является опцией. Мне нужно знать разницу между параметром, явно установленным в 0 или по умолчанию равным 0.
Просто используйте func_num_args () , чтобы конкретно проверить, сколько аргументов было передано.
<?php
function foo($bar = 0)
{
echo "\nNumber of arguments: " . func_num_args();
}
// Outputs "Number of arguments: 1"
foo(0);
// Outputs "Number of arguments: 0"
foo();
?>
Вы можете использовать func_get_args
. Пример:
function foo($optional=null) {
if (count(func_get_args()) > 0)
echo "optional given\n";
else
echo "optional not given\n";
}
foo(); //optional not given
foo(null); //optional given
Обратите внимание, что для внутренних функций PHP принято всегда присваивать необязательным аргументам значение по умолчанию и иметь одинаковое поведение, когда оба аргумента не указаны, а их значение по умолчанию указано явно. Если вы обнаружите обратное, напишите сообщение об ошибке. Это позволит вам делать такие вещи без if
s:
function strpos_wrap($haystack, $needle, $offset = 0) {
return strpos($haystack, $needle, $offset);
}
Это соглашение в большей степени соблюдается в userland, как показала трудность, которая привела вас к этому вопросу. Если эта конвенция не подходит для ваших нужд, по крайней мере, пересмотрите свой подход. Назначение func_num_args
/func_get_args
в основном состоит в том, чтобы разрешить функции с переменным аргументом.