Я бы предложил использовать ассоциативный массив для передачи именованных параметров, но оставить их в массиве, не извлекая.
function myFunc(array $args) {
echo "Hi, " . $args['name'];
// etc
}
На это есть несколько причин. Глядя на эту функцию, вы совершенно ясно видите, что я имею в виду один из аргументов, переданных в функцию. Если вы извлечете их и не заметите extract()
, вы (или следующий парень) будете чесать затылок, задаваясь вопросом, откуда взялась эта переменная "$name
". Даже если вы действительно знаете, что извлекаете аргументы в локальные переменные, в определенной степени это все равно игра в угадайку.
Во-вторых, это гарантирует, что другой код не перезапишет аргументы. Возможно, вы написали свою функцию, ожидая наличия только аргументов с именами $foo
и $bar
, поэтому в другом коде вы определяете, например, $baz = 8;
. Позже вы, возможно, захотите расширить свою функцию, чтобы принять новый параметр с именем «баз», но забыть изменить другие ваши переменные, поэтому независимо от того, что передается в аргументах, $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
. Таким образом, вы точно знаете, какие переменные у вас есть.
person
nickf
schedule
25.03.2009