Как стать автором
Обновить

Простая реализация именованных параметров в PHP

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

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]); 

Это решение удобно и широко подходит для ряда случаев.
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.