PHP:有没有更简洁的语法来表示命名参数/数组?

3

我想要实现的目标是:

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。


1
我个人不会说它很丑(至少如果你格式化干净),只是不像一行代码那样舒适。我个人也更喜欢在Python中将其格式化为多行,一行代码虽然方便,但我不会称之为好看。 - enricog
4个回答

6
你可以创建一个JSON编码的字符串,然后使用json_decode()将其转换为变量。这种语法非常类似于你提到的类Python语法。
$argstr = '{"type" : "bar", "data" : [1, 2, 3], "data2" : [5, 10, 20]}';
$buildArgs = json_decode($argstr, true);

编辑:已更新代码,以适应@therefromhere的建议。


4
没错,我只是担心有人可能会开始这样做... :D - Jani Hartikainen
2
如果您将true作为json_decode的第二个参数传入,则它将按预期返回嵌套数组。http://php.net/manual/en/function.json-decode.php我会给您点赞,因为它可以完成OP所要求的操作,但我对使用它有所保留-首先,在解码字符串之前,您将无法获得任何语法检查。 - John Carter
2
我并不是说我推荐这样做。使用PHP内置的数组声明肯定更好,但是在我看来,使用这种方式可以更容易地可视化复杂变量。特别是因为字符串可以跨越多行,并使用缩进来显示信息层次结构。 - okalex
@therefromhere:我没有意识到这一点。感谢你的提醒。我已经相应地更新了代码。 - okalex
1
嗯,我无法很好地解释,但对我来说,使用如此复杂/巧妙的解决方法来避免输入数组和每个变量的一个额外字符似乎是错误的。你需要写两行代码,而不是那5 + n个字符。我的意思是,如果你从中获得了巨大的好处,那当然可以这样做,但我在这里看不到任何好处。 - Jani Hartikainen
显示剩余6条评论

2

构造这些嵌套数组没有其他选择,但您可以以使代码易读的方式格式化代码。这完全是个人偏好:

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
没有。创建数组的替代语法已经被提出多次(该链接列出了开发邮件列表中的5个单独的主题),但它们都被拒绝了。

我看过这些提案,但我没有看到他们不实施的理由。 - quantumSoup
@Aircule 页面底部有一些链接,上面写着:“列表讨论”。有足够的理由值得仔细阅读。 - Gordon

2
不,PHP中没有“简短语法”来编写数组或对象:您必须编写所有这些array()
(至少目前没有这样的语法...可能会在未来的PHP版本中出现;谁知道呢^^) 但请注意,有太多嵌套的数组会使需要调用您的函数的人难以处理:使用实际参数意味着IDE中的自动完成和类型提示...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接