Именованные параметры

Задача
Необходимо задавать аргументы функции по имени, а не просто по их местоположению в вызове функции.

Решение
Определите функцию с одним параметром, но сделайте его ассоциативным массивом:

function image($img) {
$tag = ' $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(), а не в сотнях строк кода различных функций. Кроме того, легче иметь массив пар имя/значение и одну строку, которая присваивает значения по умолчанию, чем смешивать две концепции в серии почти одинаковых повторяющихся строк..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела PHP на эту тему:
Возвращение более одного значения
Возвращение значений по ссылке
Возвращение информации об ошибке
Вызов переменных функций
Доступ к глобальной переменной внутри функции

Вернуться в раздел: PHP / 6. Функции