Массив как список параметров в PHP

Рубрика: Development | 14 November 2007, 17:35 | Vadim Voituk

Поделюсь небольшим tip-ом/triсk-ом, которым я повсеместно пользуюсь при разработке на PHP.
Цель его состоит в повышении читаемости и простоты организации кода.

Когда-то я разработал небольшую библиотеку для построение отчетов, основанных на sql-запросах.
Настройка параметров внешнего вида отчета выглядела приблизительно так:
[php]

// компактный вариант - пример 1
$Renderer->setHeader(array(
    'Тип', 'Номер',  'Стоимость, грн.',
    'Заказов, шт.', 'Сумма, грн.'
));
// менее компактный вариант - пример 2
$Renderer->setAlignOptions(array(
  REPORT_RENDER_ALIGN_LEFT,
  REPORT_RENDER_ALIGN_LEFT,
  REPORT_RENDER_ALIGN_RIGHT,
  REPORT_RENDER_ALIGN_RIGHT,
  REPORT_RENDER_ALIGN_RIGHT
));
// пример - 3
$Renderer->setCalcTotalsFor(array(3,4));

[/php]

С виду код-как-код, но меня постоянно напрягало писать эти array(). К тому же они существенно снижают читабельность кода.
Куда приятнее было бы в примере 3 вместо
setCalcTotalsFor(array(3,4))
написать простое
setCalcTotalsFor(3, 4).
Но к сожалению PHP, в отличии от “взрослых” языков, не поддерживает method overloading.

Потому решив что красота кода превыше всего, я модифицировал код приведенных методов с такого:
[php]

/**
* @param array $headersList - ...
*/
function setHeader($headersList) {
  // ... тело метода ...
}

[/php]
на
[php]

/**
* @param mixed $headersList - ...
*/
function setHeader($headersList) {
  if (!is_array($headersList))
    $headersList = func_get_args();
  // ... тело метода ...
}

[/php]

В результате вызовы этих методов можно использовать без array() при указании списка как параметра:
[php]

$Renderer->setHeader('Тип', 'Номер',  'Стоимость, грн.', 'Заказов, шт.', 'Сумма, грн.');

[/php]

IMHO за счет укороченной длины строки кода и упрощения иерархии конструкций стало куда приятнее глазу и, что самое главное, читабельнее для разработчика.

Комментариев: 7

7 Responses to “Массив как список параметров в PHP”

Комментарии:

  1. anycolor

    Метод плох тем, что наверняка вызовет NOTICE.

  2. anycolor

    Я ошибся. Только что проверил – все прекрасно работает.

  3. Скакунов Александр

    Прикольно!

    У первого метода при всей его громоздкости есть достоинство – элементы массива можно именовать.

  4. Vadim Voituk

    2 Скакунов:
    Тогда это уже будет не массив, в классическом понимании, а хэш-таблица, или именованная структура. А у неё уже и семинтика и применение другие.

  5. Vadim Voituk

    2 anycolor: Это метод не выведет NOTICE даже в strict-mode на PHP5:
    error_reporting(E_ALL | E_STRICT);

  6. Bolzamo

    Прикольно и необычно конечно, но мне обыкновенный Array почему-то больше нравится. Да и ассоциативные массивы мне завсегда больше по душе нежели простые, а как правильно заметил Скакунов Александр, вышеописанный метод не позволяет включать ассоциативные массивы в качестве параметра в специфическом применении(простым перечислением).

  7. alex

    а кто говорил что это панацея?.

    автору спасибо, надеюсь в нужный момент эта фитча всплывет в памяти :)

Leave a Reply