为啥 PHP 数组示例会留下逗号?

Posted

技术标签:

【中文标题】为啥 PHP 数组示例会留下逗号?【英文标题】:Why do PHP Array Examples Leave a Trailing Comma?为什么 PHP 数组示例会留下逗号? 【发布时间】:2011-02-19 06:01:11 【问题描述】:

我见过像下面这样的例子:

$data = array(
   'username' => $user->getUsername(),
   'userpass' => $user->getPassword(),
   'email' => $user->getEmail(),
);

然而,在实践中,我总是留下尾随的逗号。我做错了什么,还是这只是“另一种”做事方式?如果我使用的是框架,后面的逗号不会对代码生成产生负面影响吗?我也看到了在其他语言(Java、C++)的数组声明中使用尾随逗号,所以我认为留下尾随逗号的原因并不是 php 特有的,但这引起了我的兴趣。

【问题讨论】:

当我在 PHP 中离开训练逗号时,我可以发誓我遇到了解析错误。 我猜是有可能的。在这个特定的例子中,它解析得很好。 是的@LotusNotes 我确定我之前也遇到过错误。但显然,不再是了! 【参考方案1】:

为什么 PHP 数组示例会留下逗号?

因为他们可以。 :) PHP Manual entry for array 状态:

在最后一个定义的数组条目之后有一个尾随逗号,虽然不常见,但它是一种有效的语法。

说真的,这完全是为了方便,因此您可以轻松地将另一个元素添加到数组中,而无需先将尾随逗号添加到最后一个条目。

谈到其他语言:在 javascript 中要小心。一些较旧的浏览器会抛出错误,但较新的浏览器通常允许。

【讨论】:

这就是我的想法,我只是不确定我是否错过了某些事情。我想对于那些将时间花在几种允许这样做的语言上的人来说,这可能是一个不错的习惯。但鉴于我处理许多不同的语言,并且正如你所说的 JavaScript(以及谁知道其他语言)可能会引发错误,对我来说,继续我不留下逗号的习惯可能会更安全。 比 IE6/7 代码更新的 JavaScript 版本现在明确允许它。 Perl 也允许尾随逗号,我相信这是鼓励的。在使用源代码管理的开发人员之间共享代码时,它实际上非常好。如果您想在末尾添加一行并且需要添加一个逗号,这意味着您正在触及两行。 git blame(或其他源代码控制中的等效项)将显示您编写了该行,即使您只是在其中添加了一个逗号。无论哪种方式都不是什么大不了的事,但很方便。 如果您的文件处于源代码控制之下,这有助于保持低更改行数。 JSON 也是,JSON 讨厌尾随逗号。【参考方案2】:

在多行上定义数组时,这是一个很好的做法。 ZendFramework's coding standards 也鼓励它:

当使用后一种声明时,我们 鼓励使用尾随逗号 数组中的最后一项;这 最大限度地减少添加新的影响 连续行上的项目,并帮助 以确保不会发生解析错误 缺少逗号。

【讨论】:

【参考方案3】:

我注意到在使用版本控制 (git) 时,如果我们将 1 个东西添加到数组并且我们没有尾随逗号,那么看起来我们修改了 2 行,因为逗号必须添加到前一个线。我发现这看起来很糟糕,并且在查看文件更改时可能会产生误导,因此我认为尾随逗号是一件好事。

【讨论】:

当然,为什么尾随逗号是为了 :) Diff 一致性 我不知道它是否与它为什么在那里有关。我认为不会。但我觉得它很有用。 但这它在这里的原因。可以说它在这里是为了防止下一行添加错误。但事实并非如此,因为现在没有 IDE 会让你在没有 comme 的情况下添加行,它会弹出错误通知。 @Ninj 有趣。我认为您的第一条评论具有讽刺意味,但我不确定。 抱歉,这可能看起来很讽刺。这是非常严重的。我们在数组的最后一行添加逗号,以帮助清理版本控制差异。【参考方案4】:

因为它使条目保持统一。

如果您不得不交换订单,或者添加或删除条目,您知道能够留下一个尾随逗号非常方便。

如果最后一个元素不能有逗号,那么您最终必须通过修改条目来维护最后一个逗号。这是一个毫无意义的练习,浪费时间和手指敲击,因为交换或修改条目的意图已经实现。

通过在最后一个元素上允许尾随逗号,它使程序员免于处理这种烦人且徒劳的细节。

【讨论】:

【参考方案5】:

原因是提交更改。

如果您必须在添加新元素时添加尾随逗号。您正在更改 1 行并添加 1 行。 (-++)

当逗号已经在上面的行中时添加新元素。仅添加了 1 行,没有更改。 (+)

【讨论】:

【参考方案6】:

我不能代表其他人,但我通常会在我的代码中留下一个逗号。我这样做是因为如果/当我稍后添加到数组中时,我不必担心由于忘记在之前的最后一行添加逗号而错过逗号。

【讨论】:

【参考方案7】:

我总是使用尾随逗号,因为它有助于在添加新数组元素时避免语法错误...这只是一个好习惯。

【讨论】:

我很抱歉恢复了这个,但是,尾随逗号如何防止以后出现语法错误?我刚刚发现 PHP 允许使用尾随逗号 - 但我看不到/找不到它的用途。稍后添加新索引仍然通过$arr[] = ... 完成。 @Daniel,他说的是稍后返回源代码并在数组文字中添加另一行。【参考方案8】:

我觉得即使允许这样做也是不好的做法,就像省略了函数和循环的最后一个分号。

【讨论】:

【参考方案9】:

如果您查看一个圆形立方体文件配置 (config.inc.php) 的示例,它们有带和不带尾随逗号的示例。

这个数组定义了应该启用或禁用哪些插件:

...
// List of active plugins (in plugins/ directory)
$config['plugins'] = array(
'managesieve',
'password',
'archive',
'zipdownload',
);
...

通常,这是一行一行的,如果有人想在数组上添加一些东西,他们可以这样做:

...
// List of active plugins (in plugins/ directory)
$config['plugins'] = array(
'managesieve', //code by personA
'password', //code by personA
'archive', //code by personA
'zipdownload', //code by personA
'newplugin', //new code by personB
);
...

因此,当他们提交此代码时,他们只会看到该特定行的一个更改,并且在检查谁为该特定行进行代码更改时更具可读性。

在另一行代码中你可以看到这个没有尾随逗号:

...
$config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'INBOX.spam', 'Trash');
...

通常它会是一行代码,没有人期望此代码会经常更改。

换句话说:

1) 如果数组被用作将来可能需要动态更改的选项或配置文件,则放置尾随逗号。此外,如果您使用尾随逗号以编程方式更改该数组,您只需更改一行代码,而没有它,您必须处理 2 行代码,这可能会导致解析数组更加复杂

2) 如果数组是一个常量数组并且您不希望它在未来发生变化,则您不必放置尾随逗号,但正如已接受的答案所述,您可以放置​​尾随逗号,但它没有目的

【讨论】:

【参考方案10】:

这最近让我感到惊讶,但它是有道理的。长期以来,我一直试图遵守实现相同目的的早期约定,即将分隔的逗号 放在每个条目的前面,而不是放在末尾。

$data = array(
   'username' => $user->getUsername()
 , 'userpass' => $user->getPassword()
 , 'email' => $user->getEmail()
);

逗号也都是这样排列的,看起来不错,但会使缩进有点尴尬。也许是因为这个原因,这些年来它似乎并没有流行起来,而且我让其他人问我为什么这样做。我猜 PHP 的解决方案是一个很好的折衷方案,无论如何,它显然是现在公认的解决方案。

【讨论】:

【参考方案11】:

我总是在新条目的开头添加逗号。 编译器将其视为前瞻的单字符标记 上面写着“还有一个来了”。不知道现代有没有 编译器使用 LR(1)(左递归,单标记前瞻),但 我认为这就是逗号产生语法错误的地方 之后什么都没有。 很少有其他开发人员同意我的观点,但是 看起来像约翰布鲁金!

【讨论】:

以上是关于为啥 PHP 数组示例会留下逗号?的主要内容,如果未能解决你的问题,请参考以下文章

为啥有逗号开始数组?例如,jQuery.ajax(url [, setting])

php 二维数组合并 用逗号分开

无论我是不是将尾随逗号放入数组中,性能是不是存在差异?

当我将 print_r() 应用于 PHP 中的数组时,为啥会得到“资源 id #4”? [复制]

PHP数组转字符串(属性加单(双)引号,逗号分隔)

如何将 PHP 数组表示为逗号分隔的字符串? [复制]