Именованные параметры функций могут быть удобны в случае, когда на вход принимается много значений, а многие вызовы опускают часть аргументов. Становится тяжело уследить за порядком аргументов. Кроме того, появляется следующая проблема. Представим, что у нас есть функция
В одном месте кода мы хотим вызвать ее, определив значение параметра
Пока всё хорошо. Но, если мы захотим где-то еще вызвать ее с определенным значением параметра
Это нехорошо, правда? Во-первых, непонятно, что это за магическое число такое, и вообще читаемость затрудняется. Во-вторых, копировать уже существующий код — плохо. Например, придется при каждом изменении дефолтного значения вручную менять их во всём коде. Еще одна проблема возникнет, если я добавлю третий параметр и захочу изменить самый вызов
Наиболее простое и гибкое в реализации решение, которое я и предлагаю, — использовать ассоциативные массивы с текстовыми ключами и функцию
Это решение удобно и широко подходит для ряда случаев.
function someFunction($a = 1, $b = 2)
{
...
}
В одном месте кода мы хотим вызвать ее, определив значение параметра
$a
, оставив $b
по умолчанию:someFunction($expr);
Пока всё хорошо. Но, если мы захотим где-то еще вызвать ее с определенным значением параметра
$b
, сохранив значение $a
по умолчанию, нам придется сделать так:someFunction(1, $expr);
Это нехорошо, правда? Во-первых, непонятно, что это за магическое число такое, и вообще читаемость затрудняется. Во-вторых, копировать уже существующий код — плохо. Например, придется при каждом изменении дефолтного значения вручную менять их во всём коде. Еще одна проблема возникнет, если я добавлю третий параметр и захочу изменить самый вызов
someFunction($expr);
: мне придётся написать что-то вроде someFunction($expr, 2, $val);
.Наиболее простое и гибкое в реализации решение, которое я и предлагаю, — использовать ассоциативные массивы с текстовыми ключами и функцию
array_merge
(в случае с целочисленными ключами функция сломается):function someFunction($args = [])
{
$defaultArgs = [
'a' => 1,
'b' => 2,
];
$args = array_merge($defaultArgs, $args);
...
}
...
// вызов со всеми параметрами по умолчанию
someFunction();
// вызов с определенным значением параметра b и остальными значениями по умолчанию. Нам неважно, каковы они и сколько их
someFunction(['b' => 3]);
Это решение удобно и широко подходит для ряда случаев.