Как определить, является ли необязательный параметр в методе PHP / функция была установлена ​​или нет?

Предположим, у меня есть метод / функция со следующей сигнатурой:

foo($bar = 0)

Внутри foo , как мне узнать, если $ bar был установлен или нет? isset всегда будет возвращать TRUE , поскольку $ bar назначается 0 , если ничего не передано в foo .

Проверка на 0 не является опцией. Мне нужно знать разницу между параметром, явно установленным в 0 или по умолчанию равным 0.

14
задан Charles 23 December 2012 в 23:47
поделиться

2 ответа

Просто используйте 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();
?>    

Живой пример

15
ответ дан 1 December 2019 в 12:12
поделиться

Вы можете использовать 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 принято всегда присваивать необязательным аргументам значение по умолчанию и иметь одинаковое поведение, когда оба аргумента не указаны, а их значение по умолчанию указано явно. Если вы обнаружите обратное, напишите сообщение об ошибке. Это позволит вам делать такие вещи без ifs:

function strpos_wrap($haystack, $needle, $offset = 0) {
    return strpos($haystack, $needle, $offset);
}

Это соглашение в большей степени соблюдается в userland, как показала трудность, которая привела вас к этому вопросу. Если эта конвенция не подходит для ваших нужд, по крайней мере, пересмотрите свой подход. Назначение func_num_args/func_get_args в основном состоит в том, чтобы разрешить функции с переменным аргументом.

9
ответ дан 1 December 2019 в 12:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: