PHP-функция: прохождение параметров

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

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

С одной стороны, вы можете передать их как индивидуальные параметры, как показано ниже:

foo($var1, $var2, $var3 ...);

С другой стороны, вы можете упаковать свои переменные в массив, а затем передать один аргумент функции, массив:

  $bar[] = $var1; $bar[] = $var2; $bar[] = $var3; ... foo($bar); 

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

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

Итак, при каких обстоятельствах должен использоваться тот или иной, а что касается промежуточной точки, где, например, массив ассоциативен, поэтому вы можете получить переменные из-за имени внутри функции и использовать их в универсальном режиме? Для меня сценарий ассоциативного массива кажется очень неоптимальным, и это просто способ, которым некоторые разработчики используют, чтобы сделать вызов функции короче, фактически увеличивая общий объем написанного кода.

Solutions Collecting From Web of "PHP-функция: прохождение параметров"

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

Передача массива полезна только в том случае, если функция принимает несколько необязательных параметров, которые могут быть переданы практически в любом порядке:

 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 : как вы можете видеть, есть довольно много вариантов, большинство из которых вы, вероятно, захотите сохранить по умолчанию. Если вам нужно было передать все эти параметры в качестве аргумента, вы просто раздуваете код, копируя значения по умолчанию.