call_user_func_array, чтобы не принимать неожиданные параметры функции

0

У меня есть функция, которая не принимает никаких параметров, т.е. function doSomething(){...}.

Если я запустил, call_user_func_array('doSomething', array('param1' => 'something')); он не возвращает ошибку.

Могу ли я заставить его вызвать ошибку, например: "Эта функция не должна принимать параметры".

  • 0
    Конечно, просто проверьте через func_num_args() и, если необходимо, сгенерируйте исключение
  • 0
    Кстати: совершенно неважно, как вы вызываете функцию, напрямую или с помощью call_user_func() , не имеет значения.
Теги:
function
php-5.5
argument-passing

3 ответа

1
Лучший ответ

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

function doSomething(){
    if (func_num_args() > 0) {
        throw new Exception('Too many arguments');
    }
    ....
}

Используйте что-то вроде выше, чтобы проверить аргументы, которые были переданы вашей функции

  • 0
    Я посмотрел на это, но с большим количеством функций было бы замечательно не делать это для всех функций. Может быть, я мог бы проверить количество принятых аргументов перед вызовом call_user_func_array ?
  • 0
    call_user_func_array('doSomething', array('param1' => 'something')); не способствует проверке аргументов в массиве, когда вы определяете массив в реальном вызове, а не заранее .... но почему это такая проблема? Если ваш код выполняет вызов, то вы контролируете, что передается функции
Показать ещё 5 комментариев
1

Вы можете использовать func_num_args:

function foo()
{
    $n = func_num_args();
    if ($n > 0) {
        echo "Number of arguments: $n, 0 expected.";
    return;
    }
}

foo(1, 2, 3);

:: Информация

0

Проверьте класс ReflectionFunction. Используя это, вы можете определить, сколько параметров ожидает функция и не называть ее несоответствием.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню