PHP: менее уродливый синтаксис для именованных параметров / массивов? - PullRequest
3 голосов
/ 13 июля 2010

Вот что я пытаюсь сделать:

function foo($args) {
 switch($args['type']) {
  case 'bar':
  bar($args['data']);   // do something
  break;
 }
}

// or something like that

В основном это способ использования именованных параметров в PHP.

Теперь, чтобы построить этот массив $args, я вынужден написать ужасный синтаксис, такой как:

$builtArgs = array('type' => 'bar',
     'data' => array(1, 2, 3),
     'data2' => array(5, 10, 20)
  );

foo($builtArgs);

Что становится ужаснее, когда я добавляю больше измерений в массив, а также вынуждает меня писать тонны конструкций array(...). Есть ли более красивый способ сделать это?

С одной стороны, это можно было бы сделать, если бы мы могли использовать Python-подобный синтаксис:

$buildArgs = {'type' : 'bar', 'data' : [1, 2, 3], 'data2' : [5, 10, 20]};

Но это PHP.

Ответы [ 4 ]

6 голосов
/ 13 июля 2010

Вы можете создать строку в кодировке JSON и использовать json_decode() для преобразования ее в переменную. Он имеет синтаксис, очень похожий на синтаксис, подобный Python, о котором вы упоминали.

$argstr = '{"type" : "bar", "data" : [1, 2, 3], "data2" : [5, 10, 20]}';
$buildArgs = json_decode($argstr, true);

РЕДАКТИРОВАТЬ: Обновлен код, чтобы приспособить @ предложение там.

2 голосов
/ 13 июля 2010

Нет, в PHP нет «короткого синтаксиса» для записи массивов или объектов: вы должны написать все эти array().
(По крайней мере, такого синтаксиса нет ... пока; может появиться в будущей версии PHP; кто знает ^^)

Но учтите, что слишком большое количество таких встроенных массивов усложнит задачу людям, которым придется вызывать ваши функции: использование реальных параметров означает автозаполнение и подсказку типов в IDE ...

2 голосов
/ 13 июля 2010

Нет альтернативы построению этих вложенных массивов, но есть варианты того, как вы можете отформатировать код, чтобы сделать его читаемым. Это строго предпочтение:

return array
(
    'text' => array
    (
        'name'      => 'this is the second',
        'this'      => 'this is the third',
        'newarr'    => array
        (
            'example'
        ),
    )
);


// Or using the long way

$array = array();

$array += array
(
    'this' => 'is the first array'
);
2 голосов
/ 13 июля 2010

Нет.Альтернативные синтаксисы для создания массивов были предложены несколько раз (ссылка содержит 5 отдельных потоков в списке рассылки dev), но они были отклонены.

...