Необязательные параметры PHP - указать значение параметра по имени? - PullRequest
6 голосов
/ 27 октября 2010

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

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");

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

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

Ответы [ 4 ]

12 голосов
/ 27 октября 2010

Нет, в 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
}
3 голосов
/ 27 октября 2010

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

2 голосов
/ 27 октября 2010

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

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

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

$args = array('do' => 'do', 'or' => 'not', 'nothing' => 'something');
doSomething($args);
0 голосов
/ 27 октября 2010

PHP не имеет именованных параметров.Вам придется выбрать один обходной путь.

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

 function with_options($any) {
      parse_str($any);    // or extract() for array params
 }

 with_options("param=123&and=and&or=or");

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

...