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

96

我看到了以下类似的示例:

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

然而,实际上我总是去掉尾随逗号。这样做有问题吗,还是这只是另一种做法?如果我在使用框架时没有尾随逗号会对代码生成产生负面影响吗?我在其他语言(Java、C++)的数组声明中也看到了尾随逗号的使用,因此我认为留下尾随逗号的原因并不特定于PHP,但这引起了我的兴趣。


1
我敢肯定,如果我在PHP中训练逗号时会出现解析错误。 - Lotus Notes
可能吧,我猜。在这个特定的例子中,它解析得很好。 - ashurexm
是的,@LotusNotes,我肯定以前也遇到过错误。但显然,现在不再有了! - Meezaan-ud-Din
11个回答

123
为什么PHP数组示例会留下尾逗号?
因为可以 :) PHP手册条目array 表示:
在最后的定义数组入口之后有一个尾逗号,虽然不寻常,但是仍是有效的语法。
说实话,这完全是为了方便,这样您就可以轻松地向数组添加另一个元素,而无需首先将尾逗号添加到最后一个条目中。
谈到其他语言:在JavaScript中要小心。一些旧版本浏览器会引发错误,尽管新版本通常允许这样做。

7
现在比IE6/7更新的JavaScript版本能够明确地允许这样做的代码。 - staticsan
11
Perl也允许使用尾随逗号,而且我认为这是被鼓励的。在使用源代码控制时,共享代码时非常方便。如果你想在结尾添加一行,并且你需要添加一个逗号,那就意味着你需要同时修改这两行。使用git blame(或其他源代码控制工具等效的功能)会显示你编写了该行,即使你只是添加了逗号。不管怎样,这并不是很重要,但很方便。 - redbmk
3
如果您的文件受源代码控制,保持更改行数较少会非常有用。 - hakre
7
JSON同样如此,JSON不支持末尾逗号。 - Kyle Hotchkiss
2
Lua也允许使用尾随逗号,这样做有助于保持数组项的一致性和编写的便利性。 - lfree
显示剩余11条评论

32

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


2
这就是为什么尾随逗号存在的原因 :) 代码一致性 - Ninj
我不知道它是否与它存在的原因有关。我认为不是。但我发现它很有用。 - user985366
但这正是它存在的原因。有人可能会说它的存在是为了防止下一行添加错误,但实际上不是这样的,因为现在没有任何集成开发环境会让你添加没有注释的行,这会弹出错误提示信息。 - Ninj
@Ninj 有趣。我一开始认为你的评论是反讽的,但我不确定。 - user985366
1
抱歉,这可能看起来有些讽刺。但实际上非常严肃。我们在最后一个数组行上添加逗号是为了帮助版本差异保持干净。 - Ninj
显示剩余2条评论

31

在多行定义数组时这是一种好的实践。同时,ZendFramework的编码规范也鼓励使用这种方式:

使用这种方式声明数组时,我们鼓励在数组中的最后一项使用尾逗号; 这样可以将新项添加到连续的行上的影响降至最低,并有助于确保由于缺少逗号而导致的解析错误不会发生。


11

因为它使得条目保持统一。

如果你必须交换顺序,添加或删除条目,那么留下尾随逗号是非常方便的,相信你已经体验过。

如果最后一个元素不能有逗号,那么你就不得不通过修改条目来保持最后一个逗号。这是无意义的练习,浪费时间和手指敲击,因为交换或修改条目的目的已经实现了。

通过允许在最后一个元素上加上尾随逗号,程序员就不必再关注这个令人烦恼而毫无意义的细节了。


9

原因是提交更改。

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

当在上一行已经有逗号时添加新元素。只添加了1行,没有更改任何内容。 (+)


5

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


3

我总是使用尾部逗号,因为它有助于在添加新数组元素时避免语法错误……这只是一种好的实践。


3
抱歉打扰,但末尾逗号如何避免后续语法错误?我刚发现PHP允许末尾逗号,但我看不出/找不到它的用途。添加后续索引仍然通过$arr[] = ...完成。 - Daniel
1
@Daniel,他说稍后返回源代码并向数组文字中添加另一行。 - Sam Dufel

2

我认为即使这是被允许的,但这是不好的行为,就像在函数和循环中遗漏最后一个分号一样。


1
如果您查看Roundcube文件配置(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)如果数组是一个常量数组,并且您不希望它在将来发生变化,则不必添加尾随逗号,但正如接受的答案所述,您可以添加尾随逗号,但没有任何目的。

0
最近这让我感到惊讶,但它很有道理。我长期以来一直试图遵循早期的约定,实现相同的效果,即将分隔逗号放在每个条目的前面,而不是末尾。
$data = array(
   'username' => $user->getUsername()
 , 'userpass' => $user->getPassword()
 , 'email' => $user->getEmail()
);

逗号也可以这样对齐,看起来很不错,但是可能会使缩进有些尴尬。也许因为这个原因,多年来似乎没有被广泛采用,我曾经有人问我为什么要这样做。我想PHP的解决方案是一个很好的妥协,无论如何,现在它显然是被接受的解决方案。


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