PHP функционируют с неограниченным количеством параметров

Я думаю, что часть проблемы - то, что разработчики ожидают, что деловые люди, чтобы иметь то же множество значений и действительно заботиться об ответе на "должны мы модульный тест или нет?". Мы не заставляем одобрение заранее бизнеса использовать высокоуровневый язык, а не ассемблер - это - просто обычно разумный способ сделать работу.

точка, мы являемся единственными, квалифицированными для совершения вызова (который не должен говорить, что у всех нас есть то же знание о теме). Кроме того, даже если Ваша команда, в рамках проводимой политики, не делает поблочного тестирования (или name-your-method-of-the-day), это обычно не означает, что Вы не можете сделать этого.

истина, мы не можем действительно доказать ROI на большей части материала, который мы делаем при слишком прекрасной из гранулярности. То, почему поблочное тестирование сохранено до этого unreasonable/non-typical стандарта доказательства, вне меня...

18
задан Ólafur Waage 16 October 2009 в 10:53
поделиться

5 ответов

Все вышеперечисленные предложения хороши, но я не думаю, что они подойдут для вашей ситуации.

$stmt->bind_param('sssd', $code, $language, $official, $percent);

Если вы хотите обернуть эту функцию, вам нужно будет передать ссылок на исходные переменные аргумента в функцию bind_param. Я не думаю, что func_get_args () дает вам это, вместо этого он дает вам значения. Таким образом, их нельзя будет использовать для перехода к родительской функции. Я боролся с аналогичной проблемой при попытке расширить mysqli_stmt и так и не нашел удовлетворительного решения.

Боюсь, что это не совсем ответ на ваш вопрос, а просто предупреждение о том, что другие аргументы могут не работать в вашем конкретном приложении с произвольным количеством аргументов.

4
ответ дан 30 November 2019 в 06:22
поделиться

Используйте func_get_args () :

function my_func() {
  $args = func_get_args();
  foreach ($args as $arg) {
    echo "Arg: $arg\n";
  }
}
5
ответ дан 30 November 2019 в 06:22
поделиться

При 5 параметрах эта конструкция начинает демонстрировать AntiPattern " Слишком много параметров ". Это предполагает рефакторинг под названием Parameter Object , объект или структура с элементами данных, представляющими аргументы, которые должны быть переданы. Однако избегайте превращения его в Magic Container .

См. Также Введение в рефакторинг объекта параметров на сайте refactoring.com.

2
ответ дан 30 November 2019 в 06:22
поделиться

Существует функция с именем func_get_args () , который представляет собой массив всех аргументов, переданных функции.

Пример из PHP.net

function foo()
{
    $numargs = func_num_args();
    echo "Number of arguments: $numargs<br />\n";
    if ($numargs >= 2) {
        echo "Second argument is: " . func_get_arg(1) . "<br />\n";
    }
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

foo(1, 2, 3);

В приведенном выше примере будет выведено:

Количество аргументов: 3
Второй аргумент: 2
Аргумент 0: 1
Аргумент 1: 2
Аргумент 2: 3

0
ответ дан 30 November 2019 в 06:22
поделиться

Вы видели func_get_args , func_get_arg и func_num_args

Так, например:

function foo(){
    if ( func_num_args() > 0 ){
        var_dump(func_get_args());
    }
}

или:

function bind_param(){
    if ( func_num_args() <= 1 ){
        return false; //not enough args
    }
    $format = func_get_arg(0)
    $args = array_slice(func_get_args(), 1)

    //etc
}

РЕДАКТИРОВАТЬ
Относительно комментария Юана Тодда:
У меня нет никаких знаний о базовом API, для которого вы создаете оболочку, но другой альтернативой может быть что-то с цепочкой функций, чтобы полученный интерфейс выглядел примерно так:

$var->bind()->bindString($code)
            ->bindString($language)
            ->bindString($official)
            ->bindDecimal($percent);

Что я бы предпочел использовать func_get_args как код, вероятно, более читабелен и, что более важно, с меньшей вероятностью вызовет ошибки из-за отсутствия переменной формата.

23
ответ дан 30 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

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