Разработчику. Сборник рецептов PHP
Задавайте вопросы

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

Вернуться назад

Задача

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

Решение

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

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

Вернуться назад

Рейтинг@Mail.ru

Яндекс.Метрика

Индекс цитирования


Рейтинг Сайтов ДОСКИ.РУ