【问题标题】:PHP: less ugly syntax for named parameters / arrays?PHP:命名参数/数组的语法不那么难看?
【发布时间】:2010-07-13 16:10:42
【问题描述】:

这是我想要完成的:

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

// or something like that

这基本上是在 PHP 中使用named parameters 的一种方式。

现在,为了构建这个 $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。

【问题讨论】:

  • 我个人不会真的说它很丑(至少如果你把它格式化),只是写起来不像一个衬里那么舒服。就我个人而言,我也在 python 中将其格式化为更多行,一个衬里很舒服,但我不会称之为好。

标签: php syntax coding-style


【解决方案1】:

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

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

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

【讨论】:

  • 只是我担心有人会开始这样做... :D
  • 如果您将 true 作为第二个参数传递给 json_decode,那么它将根据需要返回嵌套数组。 php.net/manual/en/function.json-decode.php 支持你,因为它符合 OP 的要求,但我对使用它持保留意见 - 一方面,在你解码字符串之前,你不会得到任何语法检查。
  • 好吧,我并不是说我推荐它。吸收它并使用 PHP 的内置数组声明肯定会更好,但它确实更容易可视化复杂变量,IMO。特别是因为字符串可以跨越多行并使用缩进来显示信息层次结构。
  • @therefromhere:我没有意识到这一点。谢谢你的收获。我相应地更新了代码。
  • 嗯,我不能很好地解释它,但对我来说,使用这种复杂/骇人的解决方法来输入数组和每个变量一个额外的字符似乎是错误的......你是写两行代码而不是那些 5 + n 个字符。我的意思是,如果你从这样做中获得巨大的好处,当然可以,但我在这里看不到。
【解决方案2】:

没有。用于创建数组的替代语法已多次使用proposed(该链接在开发邮件列表中列出了 5 个单独的线程),但都被拒绝了。

【讨论】:

  • 我已经看过这些提案,但我看不出他们不实施它的理由。
  • @Aircule 在页面底部有许多链接,上面写着:Discussion on the List。有很多理由可以通读。
【解决方案3】:

不,在 PHP 中没有编写数组或对象的“短语法”:您必须编写所有这些 array()
(至少,目前还没有这样的语法......但是;可能会出现在 PHP 的未来版本中;谁知道 ^^)

但请注意,有太多这样的叠置数组会让那些不得不调用你的函数的人更难:使用实参数意味着在 IDE 中自动完成和类型提示...

【讨论】:

    【解决方案4】:

    除了构建这些嵌套数组之外,别无选择——但您可以选择如何格式化代码以使其具有可读性。这是严格的偏好:

    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'
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      • 2013-06-25
      • 1970-01-01
      相关资源
      最近更新 更多