Передача массива параметров по сравнению с отдельными параметрами в функцию в PHP? [закрытый]


Когда есть функция, которая требует передачи ряда параметров, например семи параметров, что является лучшей практикой:

function foo($par1, $par2, $par3, $par4, $par5, $par6, $par7)
{
}

Или

function foo(array $args)
{
}

Где во втором примере $args будет массив с параметрами в качестве элементов.

Я бы непоследовательно с использованием обоих методов.

Недостатком использования первого метода является то, что если вы получаете неправильный порядок параметра, вы облажались (и это может быть действительно трудно отладить, потому что это не всегда так). очевидный). Это преимущество использования метода массива.

Преимущество (IMHO) использования первого типа заключается в том, что хороший редактор PHP, такой как PhpStorm, покажет вам имена параметров, когда вы вводите функцию, что проще, чем перейти к функции, чтобы увидеть, какие параметры нужно передать в массив.

Ценю ваш совет.

3 6

3 ответа:

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

Практически, при передаче параметров в массиве, вы должны сделать тонну ручных проверок, чтобы убедиться, что правильные параметры были переданы. Вы можете избежать практически любой двусмысленности, четко указав свои параметры, логические имена (и типографские знаки, где это возможно). Кроме того, как уже говорилось в комментарии, если метод принимает 7 параметров, он, вероятно, созрел для некоторого рефакторинга.

Edit: если ваш метод / функция принимает набор неопределенно определенных "опций", которые влияют на то, что код делает только незначительным образом, рассмотрите возможность использования компонента Symfony OptionsResolver, чтобы значительно облегчить проверку вашего массива опций.

Я думаю, что этот вопрос сводится к "насколько силен типизированный php?" или " насколько сильно я хочу, чтобы мои вещи были напечатаны?"

Очевидно, что массив является наиболее слабо связанным. Количество переменных и их имена являются полными до вызывающего абонента.

Ваш вызов с отдельными параметрами немного сильнее связан, поэтому должно быть, по крайней мере, число параметров, которые будут предоставлены.

ИМХО вы забыли один тип вызова, и это с type hinting. То есть самый сильный способ сильной типизации, который предоставляет php на данный момент.

Пример:

function foo(\MyNamespace\MyObject $par1, \YourNamespace\YourObject $par2)
{
}

Мое мнение: с моим фоном только в сильных типизированных языках, я предпочитаю сильные типизированные typed hinting. Ходят слухи, что php 5.5 или php 6 также будут поддерживать скаляры в качестве подсказки типа.

Если у вас есть много вариантов, основанных на аргументах, или вы хотите больше гибкости, попробуйте func_get_args().

function foo()
{
    $arg_list = func_get_args();
    for ($i = 0; $i < $numargs; $i++) {
        echo "Argument $i is: " . $arg_list[$i] . "<br />\n";
    }
}

Если вы хотите сузить допустимые аргументы, то лучше всего определить переменные.