Функция со списком аргументов переменной длины - PullRequest
0 голосов
/ 29 сентября 2011

Если у меня есть следующая функция:

function foo($a = 'a', $b = 'b', $c = 'c', $d = 'd')
{
    // Do something
}

Могу ли я вызвать эту функцию и передать только значение для $ d, оставив все остальные аргументы с их значениями по умолчанию? С кодом примерно так:

foo('bar');

Или я должен назвать это примерно так:

foo(null, null, null, 'bar');

Ответы [ 6 ]

1 голос
/ 29 сентября 2011

Нет, вы не можете. Использовать массивы:

function foo($args) {
   extract($args);
   echo $bar + $baz;
}

foo(array("bar" => 123, "baz" => 456));

Напишите отчет об ошибке на php.net и попросите их добавить именованные аргументы в язык!

1 голос
/ 29 сентября 2011

Вы должны использовать нули, как вы сказали:

foo(null, null, null, 'bar');

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

function update_d($val){
    foo(null, null, null, $val);
}

Или вы можете использовать массивы так:

$args = array($a = 'a', $b = 'b', $c = 'c', $d = 'd');
foo($args);
0 голосов
/ 29 сентября 2011

Вы не можете сделать это без перегрузки методов.

В этом случае ваша программа предполагает, что если передан только один параметр, это четвертый.

0 голосов
/ 29 сентября 2011

func_get_args () - Получает массив списка аргументов функции.
func_num_args () - возвращает количество аргументов, переданных функции

function foo()
{
     $numargs = func_num_args();
     echo "Number of arguments: $numargs<br />\n";
}


foo(a); foo(1,b,c); will work fine
0 голосов
/ 29 сентября 2011

Краткий ответ: Нет. Длинный ответ: Неееееееееееееееееет

Значение аргумента по умолчанию будет использоваться, когда переменная вообще не установлена.

0 голосов
/ 29 сентября 2011

Вы должны сделать это, как

foo(null, null, null, 'bar');

Альтернативой является исключение аргументов из сигнатуры функции и использование func_get_args() для получения значений;

function foo() {
    $args = func_get_args();

Но, тем не менее, если вы пропустите первые три значения null, нет способа узнать, что 'bar' - это параметр $d.Заметьте, кстати, что этот подход нежелателен в большинстве случаев, потому что он запутывает вашу подпись функции и снижает производительность.

...