PHP Необязательные параметры – указать значение параметра по имени?

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

function doSomething($do, $something = "something") { } doSomething("do"); doSomething("do", "nothing"); 

Но предположим, что у вас есть следующая ситуация:

 function doSomething($do, $something = "something", $or = "or", $nothing = "nothing") { } doSomething("do", $or=>"and", $nothing=>"something"); 

Таким образом, в вышеприведенной строке значение «что-то» будет по умолчанию «чем-то», хотя я устанавливаю значения для всего остального. Я знаю, что это возможно в .net – я использую его все время. Но мне нужно сделать это в PHP, если это возможно.

Может ли кто-нибудь сказать мне, возможно ли это? Я изменяю партнерскую программу Omnistar, которую я интегрировал в корзину покупок Interspire, поэтому я хочу, чтобы функция работала нормально для любых мест, где я не изменяю вызов функции, но в одном месте (которое я расширяю) я хотите указать дополнительные параметры. Я не хочу создавать другую функцию, если только мне это не нужно.

Нет, в PHP это невозможно с точки зрения написания. Использовать аргументы массива:

 function doSomething($arguments = array()) { // set defaults $arguments = array_merge(array( "argument" => "default value", ), $arguments); var_dump($arguments); } 

Пример использования:

 doSomething(); // with all defaults, or: doSomething(array("argument" => "other value")); 

При изменении существующего метода:

 //function doSomething($bar, $baz) { function doSomething($bar, $baz, $arguments = array()) { // $bar and $baz remain in place, old code works } 

Посмотрите на func_get_args: http://au2.php.net/manual/en/function.func-get-args.php

Именованные аргументы в настоящее время недоступны в PHP (5.3).

Чтобы обойти это, вы обычно видите функцию, получающую array() аргументов array() а затем используя extract() чтобы использовать предоставленные аргументы в локальных переменных или array_merge() для их по умолчанию.

Ваш оригинальный пример будет выглядеть примерно так:

 $args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something'); doSomething($args); 

PHP не имеет именованных параметров. Вам нужно будет решить одно обходное решение.

Чаще всего используется параметр массива. Но другой умный метод использует параметры URL, если вам нужны только литеральные значения:

  function with_options($any) { parse_str($any); // or extract() for array params } with_options("param=123&and=and&or=or"); 

Объедините этот подход с параметрами по умолчанию, поскольку он подходит для вашего конкретного варианта использования.