rfc:foreachlist

RFC: foreach_variable supporting T_LIST

Introduction

This feature introduces list() support in foreach constructs:

<?php
$users = array(
    array('Foo', 'Bar'),
    array('Baz', 'Qux'),
);
 
// Before
foreach ($users as $user) {
    list($firstName, $lastName) = $user;
    echo "First name: $firstName, last name: $lastName. ";
}
 
// After
foreach ($users as list($firstName, $lastName)) {
    echo "First name: $firstName, last name: $lastName. ";
}

This feature eliminates the use of a redundant variable ($user in the example above), reduces code verbosity in typical cases of iterating structured data, such as SQL result sets, and it doesn't introduce new keywords, but simply reuses a familiar PHP construct in a new context.

It's a commonly requested feature, and there is evidence that people already expect list() should work in this scenario: #10203 allow foreach($array as list($a,$b)

This RFC provides a behavior specification and implementation for this feature.

Implementation details of the RFC

In order to avoid the reduce/reduce conflict, new bison rules will be added to the existing “foreach_variable”, to avoid this side effect:

<?php
foreach (array(1,3,4) as &$key => $foo) {
 
}

Without the new patch:

PHP Parse error:  syntax error, unexpected '&', expecting T_STRING or T_VARIABLE or '$' in /home/huixc/test.php on line 2

With the new patch:

PHP Fatal error:  Key element cannot be a reference in /home/huixc/test.php on line 2

Fatal error: Key element cannot be a reference in /home/huixc/test.php on line 2

Possible additional features (vote separately): silent token

It is possible to add support of the silent token in the new context:

$array = array(array(1,3,4), array(1, 2));
foreach ($array as @list($a, $b, $c)) {
}                                   1

Patches

Vote

Should this RFC be merged into trunk?
Real name Yes No
aharvey (aharvey)  
derick (derick)  
googleguy (googleguy)  
hradtke (hradtke)  
ircmaxell (ircmaxell)  
kassner (kassner)  
kriscraig (kriscraig)  
laruence (laruence)  
levim (levim)  
nikic (nikic)  
rdohms (rdohms)  
seld (seld)  
stas (stas)  
willfitch (willfitch)  
zhangzhenyu (zhangzhenyu)  
Final result: 11 4
This poll has been closed.
Should this RFC(with supporting of silent token) be merged into trunk?
Real name Yes No
aharvey (aharvey)  
googleguy (googleguy)  
ircmaxell (ircmaxell)  
kassner (kassner)  
kriscraig (kriscraig)  
laruence (laruence)  
levim (levim)  
nikic (nikic)  
rdohms (rdohms)  
stas (stas)  
willfitch (willfitch)  
zhangzhenyu (zhangzhenyu)  
Final result: 2 10
This poll has been closed.

Changelog

  • 2011-07-06 Xinchen Hui: Initial RFC creation
  • 2011-07-06 Xinchen Hui: Updated patch
  • 2011-07-06 Xinchen Hui: Added tests phpt
  • 2011-07-07 Xinchen Hui: Added supporting for slience token(@)
  • 2011-07-07 Xinchen Hui: Updated sencode patch
  • 2011-07-08 Xinchen Hui: Added opcodes with silent token
  • 2011-07-24 Xinchen Hui: Updated patches that fixed a bug: znode→EA may be depend on an uninitialized value (thanks to Felipe)
  • 2012-07-18 Phidev: Rewrote the RFC
  • 2012-08-18 Xinchen Hui: Open voting
  • 2012-08-25 Xinchen Hui: Close voting
rfc/foreachlist.txt · Last modified: 2012/12/11 04:38 by laruence