Table of Contents

PHP RFC: Allow trailing comma in closure use lists

Introduction

This RFC proposes to allow an optional trailing comma in closure use lists. This is already supported for argument and parameter lists.

Consider this example:

$longArgs_longVars = function (
    $longArgument,
    $longerArgument,
    $muchLongerArgument,  // Trailing commas were allowed in parameter lists in PHP 8.0
) use (
    $longVar1,
    $longerVar2,
    $muchLongerVar3
) {
   // body
};
$longArgs_longVars(
    $longArgumentValue,
    $obj->longMethodCall(),
    $obj->longPropertyName ?? $longDefault,
);

This closure declaration has too many parameters and closure use variables to place all of them on one line, at least under conventional coding standards. In such cases PSR-12 recommends using the formatting above instead (PSR-12 predates support for trailing commas in parameter lists).

Unfortunately, it is currently not possible to place a trailing comma in the closure use list. This breaks uniformity, and results in larger diffs when a new optional closure use variable is added. Additionally, it is inconsistent with parameter lists and call-sites, which do allow a trailing comma.

At this point, I'm used to always adding a trailing comma to multi-line lists, regardless of what kind of element they contain. We should avoid having this kind of arbitrary restriction.

Proposal

Allow a single optional trailing comma in closure use lists.

Prior Art

Allow trailing comma in parameter list added support for trailing commas in parameter lists.

Allow a trailing comma in function calls added support for trailing commas in calls.

Trailing Commas In List Syntax was a previous proposal to support optional trailing commas in all list-like structures.

Nothing has substantially changed since those RFCs in technical terms, but I think the aforementioned style for breaking up large lists has become more accepted in the meantime.

Backward Incompatible Changes

None.

Vote

Yes/No, requiring 2/3 majority.

Voting starts 2020-07-15 and ends 2020-07-29.

Allow trailing comma in closure use lists
Real name Yes No
alcaeus (alcaeus)  
asgrim (asgrim)  
ashnazg (ashnazg)  
beberlei (beberlei)  
brandon (brandon)  
brzuchal (brzuchal)  
bwoebi (bwoebi)  
carusogabriel (carusogabriel)  
colinodell (colinodell)  
cpriest (cpriest)  
cschneid (cschneid)  
dams (dams)  
daverandom (daverandom)  
derick (derick)  
ekin (ekin)  
galvao (galvao)  
girgias (girgias)  
guilhermeblanco (guilhermeblanco)  
ilutov (ilutov)  
jasny (jasny)  
kalle (kalle)  
kguest (kguest)  
kocsismate (kocsismate)  
lcobucci (lcobucci)  
levim (levim)  
marandall (marandall)  
marcio (marcio)  
mariano (mariano)  
mauricio (mauricio)  
mcmic (mcmic)  
nicolasgrekas (nicolasgrekas)  
nikic (nikic)  
peehaa (peehaa)  
petk (petk)  
pmjones (pmjones)  
pollita (pollita)  
ramsey (ramsey)  
rdohms (rdohms)  
reywob (reywob)  
salathe (salathe)  
sebastian (sebastian)  
sergey (sergey)  
sirsnyder (sirsnyder)  
svpernova09 (svpernova09)  
tandre (tandre)  
theodorejb (theodorejb)  
trowski (trowski)  
twosee (twosee)  
wyrihaximus (wyrihaximus)  
Final result: 49 0
This poll has been closed.

Changelog

0.2: Fix implementation link.

Discussion

https://externals.io/message/110715 “Permitting trailing commas in closure use() declarations”

https://externals.io/message/110804 “[RFC] Allow trailing comma in closure use list”