sammyk

Sammy Kaye Powers

Contents

PHP RFC: Trailing Commas In List Syntax

Introduction

This RFC proposes allowing trailing commas for all list syntax.

Per the feedback on the internals list, this RFC broadens the scope of the original RFC to allow trailing commas in function arguments to all list syntax.

Arrays in PHP have long since supported trailing commas.

Trailing array commas

$foo = [
    'foo',
    'bar',
];

This makes for clean diffs and easy appending of new values in user-land.

Unfortunately, the other lists do not share the same luxury.

Raises a parse error

<?php
use Foo\Bar\{
    Foo,
    Bar,
    Baz,
};

Proposal

This RFC proposes allowing trailing commas in all list syntax in order to:

  1. Offer a consistent API and match the existing array functionality.
  2. Make it easy to append new elements to a list in user-land.
  3. Have cleaner diffs (so only one line shows up as being modified when appending elements instead of two).
  4. It makes code reviews a tiny bit faster and for really large codebases, that time adds up. (Sara Golemon explained why HHVM added the trailing comma syntax.)

The following lists would allow trailing commas:

  1. Grouped namepaces
  2. Function/method arguments (declarations & calls)
  3. Interface implementations on a class
  4. Trait implementations on a class
  5. Class member lists
  6. Inheriting variables from the parent scope in anonymous functions

Marcio Almada posted a gist with examples of trailing commas for the various lists (shown below):

Trailing commas for all lists

<?php
// Grouped namepaces
use Foo\Bar\{ Foo, Bar, Baz, };
 
// Arrays (already possible)
$array = [1, 2, 3,];
 
// Function/method arguments (call)
fooCall($arg1, $arg2, $arg3,);
 
class Foo implements
    // Interface implementations on a class
    FooInterface,
    BarInterface,
    BazInterface,
{
    // Trait implementations on a class
    use
        FooTrait,
        BarTrait,
        BazTrait,
    ;
 
    // Class member lists
    const
        A = 1010,
        B = 1021,
        C = 1032,
        D = 1043,
    ;
    protected
        $a = 'foo',
        $b = 'bar',
        $c = 'baz',
    ;
    private
        $blah,
    ;
 
    // Function/method arguments (declaration)
    function something(FooBarBazInterface $in, FooBarBazInterface $out,) : bool
    {
    }
}
 
// Inheriting variables from the parent scope in anonymous functions
$foo = function ($bar) use (
    $a,
    $b,
    $c,
) {
	// . . . 
};

Discussion Points

There are a number of questions that have already been discussed on the internals list.

How will it work with variadics?

PHP allows for multiple splats in one call so trailing commas would work the same way.

foo(
    ...$args,
    ...$moreArgs,
    ...$evenMoreArgs,
);

Why allocate resources to make this happen

The actual implementation for adding tailing commas to function arguments/calls is two lines. Implementing the functionality to all lists would not require many more changes to the php-src codebase.

You could just use leading commas

function foo(
   $bar
  ,$baz
  ,$boo
) { ... }
  1. Leading commas would break away from PSRs
  2. Parsing leading commas cause cognitive overhead whereas standard practice calls for trailing commas

The arguments for & against are weak

TL;DR:

  • For it: It's handy. (And the reasons detailed above).
  • Against: It's ugly. There are only minor gains.

Backward Incompatible Changes

This change would have no breaking changes.

Proposed PHP Version

PHP 7.2

Proposed Voting Choices

Each trailing comma list syntax has its own vote and requires a 2/3 majority to pass.

Patches and Tests

Votes

An option needs 2/3 votes to win

Allow trailing commas in function/method arguments (declarations and calls) (54.5% approved)
User Vote
adambaratz No
ashnazg Yes
bishop Yes
bwoebi No
cmb No
danack Yes
daverandom Yes
derick No
dmitry No
eliw No
galvao Yes
jhdxr No
joey Yes
kalle No
kelunik Yes
keyur Yes
kguest Yes
laruence No
lcobucci No
leigh No
malukenho No
marcio Yes
mariano Yes
mbeccati No
mfonda Yes
mike Yes
nikic Yes
ocramius Yes
pajoye Yes
pierrick No
pmjones No
pollita Yes
rmf Yes
salathe No
sammyk Yes
sebastian No
stas No
svpernova09 Yes
thekid Yes
trowski Yes
weierophinney Yes
yunosh Yes
zeev No
zimt No
Allow trailing commas in grouped namepaces (76.9% approved)
User Vote
adambaratz Yes
ajf Yes
ashnazg Yes
bishop Yes
bwoebi No
colinodell Yes
daverandom Yes
dmitry No
eliw No
galvao Yes
joey Yes
kalle No
kelunik Yes
keyur Yes
kguest Yes
lcobucci Yes
leigh Yes
levim Yes
malukenho Yes
marcio Yes
mariano Yes
mbeccati Yes
mike Yes
nikic Yes
ocramius Yes
pajoye Yes
pierrick No
pollita Yes
rmf Yes
salathe No
sammyk Yes
sebastian No
stas No
thekid Yes
trowski Yes
weierophinney Yes
yunosh Yes
zeev Yes
zimt No
Allow trailing commas in interface implementations on a class (21.6% approved)
User Vote
adambaratz No
ajf No
ashnazg No
bishop Yes
bwoebi No
cmb No
daverandom No
eliw No
galvao No
jhdxr No
joey Yes
kalle No
kelunik No
keyur No
kguest No
lcobucci No
leigh No
levim No
malukenho No
marcio Yes
mariano No
mbeccati No
mfonda No
mike Yes
nikic No
ocramius No
pajoye No
pierrick No
pollita Yes
salathe No
sammyk Yes
sebastian No
stas No
trowski No
weierophinney Yes
yunosh Yes
zeev No
Allow trailing commas in trait implementations on a class (19.4% approved)
User Vote
adambaratz No
ajf No
ashnazg No
bishop Yes
bwoebi No
cmb No
daverandom No
eliw No
galvao No
jhdxr No
joey Yes
kalle No
kelunik No
keyur No
kguest No
lcobucci No
leigh No
levim No
malukenho No
marcio Yes
mariano No
mbeccati No
mike Yes
nikic No
ocramius No
pajoye No
pierrick No
pollita No
salathe No
sammyk Yes
sebastian No
stas No
trowski No
weierophinney Yes
yunosh Yes
zeev No
Allow trailing commas in class member lists (19.4% approved)
User Vote
adambaratz No
ajf No
ashnazg No
bishop Yes
bwoebi No
cmb No
daverandom No
eliw No
galvao No
jhdxr No
joey Yes
kalle No
kelunik No
keyur No
kguest No
lcobucci No
leigh No
levim No
malukenho No
marcio Yes
mariano No
mbeccati No
mike Yes
nikic No
ocramius No
pajoye No
pierrick No
pollita No
salathe No
sammyk Yes
sebastian No
stas No
trowski No
weierophinney Yes
yunosh Yes
zeev No
Allow trailing commas in use lists for anonymous functions (42.1% approved)
User Vote
adambaratz No
ashnazg Yes
bishop Yes
bwoebi No
cmb No
daverandom Yes
derick No
dmitry No
eliw No
galvao No
jhdxr No
joey Yes
kalle No
kelunik Yes
keyur No
kguest Yes
lcobucci No
leigh No
levim No
malukenho No
marcio Yes
mariano Yes
mbeccati No
mike Yes
nikic Yes
ocramius Yes
pajoye No
pierrick No
pmjones No
pollita Yes
salathe No
sammyk Yes
sebastian No
stas No
trowski Yes
weierophinney Yes
yunosh Yes
zeev No