Именованные аргументы в PHP

1

В С# появилась новая функция с 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");

Мне интересно, какие решения вы используете или используете в той же ситуации.

Теги:

3 ответа

2
Лучший ответ

Как вы выяснили, именованные аргументы не существуют в 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 тоже будет прерван...

  • 0
    Eclipse прекрасно работает с определенным пользователем PHPdoc. Возможно, им нужно проверить, какие параметры им нужно отправить, но, по крайней мере, им не нужно следовать порядку и не нужно передавать все, но я знаю, что это не так уж и элегантно, как способ C # выполнить то же самое.
  • 0
    Eclipse предложит, какие имена вы можете использовать для ключей массива?
Показать ещё 2 комментария
1

Вы можете обойти это, имея массив, такой как $array= array('arg1'=>'value1'); А затем пусть функция примет массив, такой как function dostuff($stuff); Затем вы можете проверить аргументы, используя if(isset($stuff['arg1')){//do something.} внутри самой функции

Это просто работа, но, возможно, это может помочь

  • 0
    Как насчет значений по умолчанию. Мне нравится использовать значения по умолчанию для не назначенных переменных.
  • 0
    Используя массивы для предоставления данных, вы полностью контролируете, как использовать массивы.
Показать ещё 1 комментарий
1

Вы можете подделывать необязательные аргументы в стиле С++ (т.е. все необязательные аргументы находятся в конце) путем проверки для заданных переменных:

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();
  • 0
    Все еще положение имеет значение здесь. Я не могу передать значение в $b не передав значение для $a . Поправьте, если я неправильно понял.
  • 0
    Это правда, вы не можете иметь пропущенный аргумент перед явным аргументом таким образом.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню