Подтвердить что ты не робот

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

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

foo($bar = 0)

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

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

4b9b3361

Ответ 1

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

Пример в реальном времени

Ответ 2

Вы можете использовать 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);
}

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