Я знаю, что можно использовать необязательные аргументы следующим образом:
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");
Объедините этот подход с параметрами по умолчанию, поскольку он подходит для вашего конкретного варианта использования.