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

В следующей функции у нас есть некоторые аргументы со значением по умолчанию. Как я могу вызвать эту функцию с присвоением значения некоторым из них.

function foo($a, $b='def b', $c='def c', $d='def d'){
   //....
}
//call foo for $a='nu a' and $c='nu c'
foo('nu a', $c='nu c'); //but b will be assigned

Я хочу установить значение для $c и не хочу назначать их все только для $c.

  1. Не приемлемое решение:

    foo('nu a', 'def b', 'nu c');

  2. Не приемлемое решение

    //moving c to second argument function foo($a, $c='def c', $b='def b', $d='def d'){ }

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


person Hamid    schedule 29.09.2016    source источник
comment
можно ли переместить все возможные значения по умолчанию справа от аргументов функции?   -  person atoms    schedule 29.09.2016
comment
Возможный дубликат функции PHP с дополнительными параметрами   -  person Rax Weber    schedule 29.09.2016


Ответы (2)


Невозможно. Вы ищете именованные параметры, которые не поддерживаются php.

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

Кроме этого, вы не можете передать значение переменной c без передачи b.

person M.Alnashmi    schedule 29.09.2016

Невозможно «пропустить» аргумент, кроме как указать значение по умолчанию, например false, '' или null.

Вы будете использовать что-то вроде этого:

function foo($settings) {
   $a = $settings['a'];
   $b = $settings['b'];
   $c = $settings['c'];
   $d = $settings['d'];
   # code...
}

foo($settings = array(
    'a' => null,
    'b' => 'def b',
    'c' => 'def c',
    'd' => 'def d',
));

Или в индексированном массиве вы можете использовать конструкцию list() для обработки значений массива, например:

function foo($settings) {
   list($a, $b, $c, $d) = $settings;
   # code...
}

foo(array(null, 'def b', 'def c', 'def d'));

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

function foo($a, $b = 'def b', $c = 'def c', $d = 'def b') {
   # code...
}
foo($a = 'def a');
person Anass    schedule 29.09.2016