Массив параметров - PullRequest
       17

Массив параметров

2 голосов
/ 21 июля 2009

CakePHP интенсивно использует ассоциативные массивы для передачи большого количества параметров в функции. Я действительно не видел эту технику за пределами PHP и никогда не видел, чтобы она использовалась в той степени, в которой ее использует Cake. Мне очень нравится этот подход, потому что, как кажется, легче обрабатывать новые параметры в будущих выпусках вашего собственного кода, и он намного удобнее для чтения, чем просто длинный список параметров.

Как пример ...

function myFunc($params = array('name' => 'rob', 'count' => 5, 'anArray' => array('A string', 5, myObject)))
{
    // ...
}

Полагаю, это похоже на использование argc / argv, но его немного легче читать. У кого-нибудь есть список плюсов и минусов по этому методу или кто-нибудь знает, кто написал о лучших практиках с этим? Я пробовал просто гуглить, но «ассоциативный массив параметров» поднимает почти каждую статью программирования, когда-либо написанную.

Кроме того, есть ли термин для передачи параметров таким способом?

Ответы [ 5 ]

5 голосов
/ 21 июля 2009

Недостатком использования именованных параметров является документирование параметров с помощью PHPDoc. Многие редакторы / IDE предоставляют «автоматическую» документацию, которая может проанализировать ваш код и сгенерировать общие докблоки.

, например

function foo(array $bar, SomeClass $stuff) { returns $magic; }

будет производить:

/**
 * foo
 *
 * @param array $bar
 * @param SomeClass $stuff
 * @return mixed
 */
function foo(array $bar, SomeClass $stuff) { returns $magic; }

Если вы поместите все свои параметры в массив $ params, он будет выглядеть только как

/**
 * foo
 *
 * @param array $params
 * @return mixed
 */

Это также добавляет вашим разработчикам дополнительную нагрузку на ввод дополнительного кода для каждого параметра. Я бы предложил использовать сочетание двух подходов.

например. Если бы у вас была функция для возврата элемента ввода текста HTML, вы могли бы иметь следующую сигнатуру метода:

/**
 * formText
 *
 * @param string $name name of text element
 * @param string $value value of text element
 * @param array $options additional options for text element
 * @return string
 */
function formText($name, $value, $options = array());

Таким образом, вы можете легко передавать наиболее распространенные значения в функцию.

$this->formText('foo', 'Default...');

и если вам нужны дополнительные, менее распространенные параметры, вы должны использовать удобный синтаксис именованных параметров:

$this->formText('foo', 'Default...', array(
    'class' => 'bold highlighted'
));

в противном случае, используя только общий массив $ params, вам нужно будет набрать:

$this->formText(array(
    'name' => 'foo',
    'value' => 'Default...'
));
3 голосов
/ 21 июля 2009

Другие языки высокого уровня поддерживают именованные параметры для функций и методов. Например, в Python вы можете позвонить:

my_func(name='rob', count=5, an_array=['A string', 5, my_object])

То, что вы видите, является попыткой симулировать это поведение в PHP. Преимущества очевидны.

  • Гибкость
  • Не нужно знать порядок / количество ожидаемых параметров

Одним из недостатков может быть то, что поиск хеш-таблицы требуется для каждого вызова метода, но в зависимости от того, как аргументы обрабатываются в PHP, снижение производительности может быть незначительным.

3 голосов
/ 21 июля 2009

Это эмуляция использования аргументов ключевых слов. Например, в python вы можете сказать:

myFunc(name="bob", age=10, gender="male")

Так как PHP не поддерживает этот синтаксис, ассоциативные массивы - следующая лучшая вещь.

1 голос
/ 21 июля 2009

Этот метод (действительно) часто используется в Javascript с объектами (когда вы используете строку в качестве ключей, в JS вы используете объекты, а не массивы); пример см. scriptaculous Draggable .

Теперь о двух плюсах и минусах, которые сразу же приходят на ум:

  • pro: вы можете использовать любое количество параметров, которые вам нужны, и при этом иметь имена
    • и нет «только параметры в конце списка являются необязательными»
  • con: phpdoc не подходит: кажется, что есть только один параметр, и нет особых указаний на то, что он делает
  • con (следствие предыдущего): когда вы используете IDE с подсказками кода, он не может отображать имена / описания для каждого параметра: вам всегда нужно проверять документацию.

Этого единственного «con» мне достаточно: я использую этот способ передачи параметров, только если нет другого (реалистического) пути.

1 голос
/ 21 июля 2009

Это единственный способ сделать именованные параметры в PHP.

Это полезно только тогда, когда у вас есть большое количество аргументов, ИМО. В противном случае преимущества явно определенной подписи аргумента являются лучшим выбором, особенно если вы используете IDE с поддержкой "intellisense".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...