аргументы по умолчанию для вызова функции php

#php #function #args

#php #функция #аргументы

Вопрос:

Как мне вызвать функцию, в которой я хочу использовать некоторые аргументы по умолчанию, а некоторые я передаю:

 function genericlist (array $arr, string $name, [string $attribs = null], 
           [string $key = 'value'], [string $text = 'text'], 
           [mixed $selected = NULL], [ $idtag = false], [ $translate = false])
  

Я только хочу передать $ arr, $ name, $ selected и использовать значения по умолчанию для всего остального, как мне это сделать? Я знаю, что мог бы передать значения по умолчанию и перейти по порядку, но я должен найти другой способ. Спасибо.

Ответ №1:

array_merge возможно, я смогу предложить вам решение, если вы заинтересованы в использовании маршрута arrays:

 function func1($args = array())
{
   $defaults = array('X' => 10, 'Y' => 30);
   $args = array_merge($defaults, $args);
   // $args now has default arguments and user supplied arguments

   return $args;
}

func1(); // array('X' => 10, 'Y' => 30)
func1(array('X' => 40)); // array('X' => 40, 'Y' => 30)
  

Комментарии:

1. Это, вероятно, работает, но это сложнее, чем мне нужно. Я думал, что есть способ получше, но, похоже, я перепутал php с javascript или что-то в этом роде. В любом случае я просто собираюсь ввести значения по умолчанию в качестве аргументов. Спасибо за вашу помощь.

Ответ №2:

Что ж, либо вы действительно передаете значения по умолчанию, либо вы изменяете порядок аргументов таким образом, чтобы поместить $selected перед всеми другими необязательными аргументами.

Кроме того, вы можете запросить именованные параметры на форумах разработчиков PHP.

Комментарии:

1. Да, я думаю, что я путаю php с каким-то другим языком. Я, вероятно, не собираюсь запрашивать эту функцию на форумах разработчиков PHP….

2. Я знал о пропуске в значениях по умолчанию, и это то, что я в итоге сделал, поэтому я отмечаю ваш ответ как правильный. Спасибо.

Ответ №3:

Я вижу два решения:

  1. Создайте функцию с нулевыми аргументами. Когда предоставляется нулевое значение, проверьте его наличие в функции и замените его значением по умолчанию. Это обходной путь в том смысле, что он больше не указан в прототипе, но предлагает решение со значением по умолчанию с минимальными усилиями.
  2. Преобразуйте свой прототип в аргумент массива с парами ключ-значение. Это похоже на первое решение, но вы можете использовать такой метод, как array_merge , чтобы объединить массив «значение по умолчанию» и недавно переданные значения аргументов.

Пример 1:

 function abc($foo = null, $bar = null)
{
  // defaulting parameters
  if (is_null($foo)) $foo = 'Hello, world!'; // foo default value
  if (is_null($bar)) $bar = 123.45; // bar default value

  // on-ward with the function
}

// override bar, but not foo:
abc(null, 987.65);
  

Пример 2:

 function def($args)
{
  // defaulting parameters
  $args = array_merge(
    array(
      'foo' => 'Hello, world!', // Default foo value
      'bar' => 123.45           // default bar value
    ),
    $args // override with supplied values
  );

  // on-ward with the function
}

// override bar, but not foo
def(array('bar'=>987.65));
  

Комментарии:

1. Спасибо за ответ, но это сложнее, чем мне нужно. Я думал, что есть способ получше, но, похоже, я путаю php с javascript или каким-то другим языком. В любом случае я просто собираюсь ввести значения по умолчанию в качестве аргументов.