В С# появилась новая функция с 4.0, называемая Named Arguments, и хорошо сочетается с необязательными параметрами.
private static void writeSomething(int a = 1, int b = 2){
// do something here;
}
static void Main()
{
writeSomething(b:3); // works pretty well
}
Я использовал эту опцию, чтобы получить некоторые значения параметров от пользователей.
В PHP я не могу найти ничего подобного, кроме необязательных параметров, но я принимаю выполнение функции $.fn.extend
(jQuery):
function settings($options)
{
$defaults = array("name"=>"something","lastname"=>"else");
$settings = array_merge($defaults,$options);
}
settigs(array("lastname"=>"John");
Мне интересно, какие решения вы используете или используете в той же ситуации.
Как вы выяснили, именованные аргументы не существуют в PHP.
Но одним из возможных решений было бы использовать один массив как уникальный параметр - поскольку элементы массива можно назвать:
my_function(array(
'my_param' => 10,
'other_param' => 'hello, world!',
));
И в вашей функции вы будете читать данные из этого уникального параметра массива:
function my_function(array $params) {
// test if $params['my_param'] is set ; and use it if it is
// test if $params['other_param'] is set ; and use it if it is
// test if $params['yet_another_param'] is set ; and use it if it is
// ...
}
Тем не менее, есть одна серьезная неудобная идея: глядя на определение вашей функции, люди не будут знать, какие параметры она ожидает/они могут пройти.
Им нужно будет читать документацию каждый раз, когда они захотят назвать вашу функцию - что не нравится, что это?
Дополнительное примечание: IDE также не смогут предоставлять подсказки; и phpdoc тоже будет прерван...
Вы можете обойти это, имея массив, такой как $array= array('arg1'=>'value1');
А затем пусть функция примет массив, такой как function dostuff($stuff);
Затем вы можете проверить аргументы, используя if(isset($stuff['arg1')){//do something.}
внутри самой функции
Это просто работа, но, возможно, это может помочь
Вы можете подделывать необязательные аргументы в стиле С++ (т.е. все необязательные аргументы находятся в конце) путем проверки для заданных переменных:
function foo($a, $b)
{
$x = isset($a) ? $a : 3;
$y = isset($b) ? $b : 4;
print("X = $x, Y = $y\n");
}
@foo(8);
@foo();
Это вызовет предупреждение, которое я подавляю с помощью @
. Не самое элегантное решение, но синтаксически близко к тому, что вы хотели.
Изменить. Это была глупая идея. Вместо этого используйте переменные аргументы:
// faking foo($x = 3, $y = 3)
function foo()
{
$args = func_get_args();
$x = isset($args[0]) ? $args[0] : 3;
$y = isset($args[1]) ? $args[1] : 3;
print("X = $x, Y = $y\n");
}
foo(12,14);
foo(8);
foo();
$b
не передав значение для $a
. Поправьте, если я неправильно понял.