Массив как список параметров в 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 за счет укороченной длины строки кода и упрощения иерархии конструкций стало куда приятнее глазу и, что самое главное, читабельнее для разработчика.
Tweet
Метод плох тем, что наверняка вызовет NOTICE.
Я ошибся. Только что проверил – все прекрасно работает.
Прикольно!
У первого метода при всей его громоздкости есть достоинство – элементы массива можно именовать.
2 Скакунов:
Тогда это уже будет не массив, в классическом понимании, а хэш-таблица, или именованная структура. А у неё уже и семинтика и применение другие.
2 anycolor: Это метод не выведет NOTICE даже в strict-mode на PHP5:
error_reporting(E_ALL | E_STRICT);
Прикольно и необычно конечно, но мне обыкновенный Array почему-то больше нравится. Да и ассоциативные массивы мне завсегда больше по душе нежели простые, а как правильно заметил Скакунов Александр, вышеописанный метод не позволяет включать ассоциативные массивы в качестве параметра в специфическом применении(простым перечислением).
а кто говорил что это панацея?.
автору спасибо, надеюсь в нужный момент эта фитча всплывет в памяти :)