Во-первых, я хочу сказать, что я не пытаюсь начать войну здесь. Я знаю, что из моих собственных разговоров по обсуждаемой теме могут быть некоторые убежденные мнения, поэтому я ищу ответ, в котором излагаются плюсы и минусы.
В свободно типизированных языках (и я специально прихожу с точки зрения PHP) есть два способа в параметрах дизайна передать параметры (заметьте, я не говорю о получении параметров в вызываемых функциях).
С одной стороны, вы можете передать их как индивидуальные параметры, как показано ниже:
foo($var1, $var2, $var3 ...);
С другой стороны, вы можете упаковать свои переменные в массив, а затем передать один аргумент функции, массив:
$bar[] = $var1; $bar[] = $var2; $bar[] = $var3; ... foo($bar);
Я вижу преимущество второго метода, когда у вас много переменных, которые нужно обрабатывать общим способом, однако он также скрывает переменные, необходимые функции для правильной работы.
Первое решение, в то время как оно быстро становится длинным вызовом функции при увеличении числа переменных, лучше показывает, какие переменные требуется для функции, и позволяет использовать функциональные возможности для назначения значения по умолчанию, если в вызове функции передается пустое значение.
Итак, при каких обстоятельствах должен использоваться тот или иной, а что касается промежуточной точки, где, например, массив ассоциативен, поэтому вы можете получить переменные из-за имени внутри функции и использовать их в универсальном режиме? Для меня сценарий ассоциативного массива кажется очень неоптимальным, и это просто способ, которым некоторые разработчики используют, чтобы сделать вызов функции короче, фактически увеличивая общий объем написанного кода.
Я думаю, что ваш пример передачи массива довольно бессмыслен. Если вы это сделаете, вы должны обязательно передать аргументы обычным способом.
Передача массива полезна только в том случае, если функция принимает несколько необязательных параметров, которые могут быть переданы практически в любом порядке:
function x($width = 100, $height = 100, $color = 'red')
Здесь, если вы хотите изменить цвет, но не меняете ширину и высоту по умолчанию, вам нужно будет:
x(100, 100, 'blue');
Т.е. вам нужно будет скопировать значения по умолчанию в ваш код.
Вместо этого можно было бы объявить функцию следующим образом:
function x(array $opts) { $opts += array('width' => 100, 'height' => 100, 'color' => 'red'); } x(array('color' => 'blue'));
Для более реалистичного примера взгляните на конструктор Twig_Environment
: как вы можете видеть, есть довольно много вариантов, большинство из которых вы, вероятно, захотите сохранить по умолчанию. Если вам нужно было передать все эти параметры в качестве аргумента, вы просто раздуваете код, копируя значения по умолчанию.