PHP:命名参数/数组的语法不那么难看?

qua*_*oup 3 php syntax coding-style

这就是我想要完成的事情:

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

// or something like that
Run Code Online (Sandbox Code Playgroud)

这基本上是在PHP 中使用命名参数的一种方式.

现在,为了构建这个$args数组,我被迫编写丑陋的语法,如:

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

foo($builtArgs);
Run Code Online (Sandbox Code Playgroud)

当我向数组中添加更多维度时,这会变得更加丑陋,并且还迫使我编写大量的array(...)构造.有更好的方法吗?

首先,如果我们可以使用类似Python的语法,就可以完成:

$buildArgs = {'type' : 'bar', 'data' : [1, 2, 3], 'data2' : [5, 10, 20]};
Run Code Online (Sandbox Code Playgroud)

但它是PHP.

oka*_*lex 6

您可以创建一个JSON编码的字符串,并用json_decode()它将其转换为变量.这个语法与您提到的类似Python的语法非常相似.

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

编辑:更新代码以适应@herehere的建议.

  • 只是我担心有人可能会开始这样做......:D (4认同)
  • 如果你将true作为第二个参数传递给json_decode,那么它将根据需要返回嵌套数组.http://php.net/manual/en/function.json-decode.php从那时起你就可以提出OP的要求,但我对使用它有所保留 - 一方面你没有得到任何语法检查直到你解码字符串. (2认同)
  • 好吧,我不是说我推荐它.使用PHP的内置数组声明肯定会更好,但它确实可以更容易地将复杂变量IMO可视化.特别是因为字符串可以跨越多行并使用缩进来显示信息层次结构. (2认同)