Задача
Необходимо задавать аргументы функции по имени, а не просто по их местоположению в вызове функции.
Решение
Определите функцию с одним параметром, но сделайте его ассоциативным массивом:
function image($img) {
$tag = '<img src="' . $img['src'] . '" ';
$tag .= 'alt="' . ($img['alt'] ? $img['alt'] : '') .'">';
return $tag;
}
$image = image(array('src' => 'cow.png', 'alt' => 'cows say moo'));
$image = image(array('src' => 'pig.jpeg'));
Обсуждение
Применение именованных параметров усложняет внутренний код функций, но облегчает чтение вызывающего кода. Функция располагается в одном месте, а вызывается из многих, что делает код более понятным.
Если при этом допустить ошибку в имени параметра, то PHP на это не отреагирует, поэтому нужна аккуратность, поскольку анализатор ко-да такую ошибку не обнаружит. Кроме того, становится недоступным такое преимущество PHP, как возможность присваивать параметру значения по умолчанию. К счастью, этот недостаток можно обойти с помощью простого кода в начале функции:
function image($img) {
if (! isset($img['src'])) { $img['src'] = 'cow.png'; }
if (! isset($img['alt'])) { $img['alt'] = 'milk factory'; }
if (! isset($img['height'])) { $img['height'] = 100; }
if (! isset($img['width'])) { $img['width'] = 50; }
...
}
Работая с функцией isset(), проверьте, установлено ли значение для каждого из параметров, и если нет, то присвойте ему значение по умолчанию.
Есть и альтернативный вариант – напишите короткую функцию, которая будет это делать:
function pc_assign_defaults($array, $defaults) {
$a = array();
foreach ($defaults as $d => $v) {
$a[$d] = isset($array[$d]) ? $array[$d] : $v;
}
return $a;
}
Эта функция выполняет цикл по последовательности ключей массива значений по умолчанию и проверяет, содержит ли данный массив $array множество значений. Если нет, то функция присваивает значения из массива $defaults. Чтобы использовать ее в предыдущем фрагменте, замените верхние строки на:
function image($img) {
$defaults = array('src' => 'cow.png',
'alt' => 'milk factory',
'height' => 100,
'width' => 50
);
$img = pc_assign_defaults($img, $defaults);
...
}
Это выглядит лучше, поскольку придает коду большую гибкость. Если необходимо модифицировать присваивание значений по умолчанию, то достаточно внести изменения в код функции pc_assign_defaults(), а не в сотнях строк кода различных функций. Кроме того, легче иметь массив пар имя/значение и одну строку, которая присваивает значения по умолчанию, чем смешивать две концепции в серии почти одинаковых повторяющихся строк.