Я бы предложил использовать ассоциативный массив для передачи именованных параметров, но сохранить их в массиве, не извлекая их.
function myFunc(array $args) {
echo "Hi, " . $args['name'];
// etc
}
Есть несколько причин для этого. Глядя на эту функцию, вы можете совершенно ясно увидеть, что я имею в виду один из аргументов, переданных в функцию. Если вы извлечете их и не заметите, что extract()
вы (или следующий парень) будете там чесать голову, задаваясь вопросом, откуда взялась эта переменная "$name
". Даже если вы действительно знаете, что извлекаете аргументы для локальных переменных, это все равно игра в догадки в определенной степени.
Во-вторых, он гарантирует, что другой код не перезаписывает аргументы. Возможно, вы написали свою функцию, ожидая, что в ней будут только аргументы с именами $foo
и $bar
, поэтому в другом коде вы, например, определяете $baz = 8;
. Позже вы, возможно, захотите расширить свою функцию, чтобы она принимала новый параметр с именем «baz», но забудьте изменить другие переменные, поэтому независимо от того, что передается в аргументах, $baz
всегда будет иметь значение 8.
Есть и некоторые преимущества использования массива (они в равной степени применимы к методам извлечения или сохранения в массиве): вы можете установить переменную в верхней части каждой функции с именем $defaults
:
function myFunc (array $args) {
$default = array(
"name" => "John Doe",
"age" => "30"
);
// overwrite all the defaults with the arguments
$args = array_merge($defaults, $args);
// you *could* extract($args) here if you want
echo "Name: " . $args['name'] . ", Age: " . $args['age'];
}
myFunc(array("age" => 25)); // "Name: John Doe, Age: 25"
Вы можете даже удалить все элементы из $args
, которые не имеют соответствующего значения $default
. Таким образом, вы точно знаете, какие переменные у вас есть.