laruence

Xinchen Hui

Contents

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

Versions

Version Changed Date
9 Xinchen Hui: Updated patch
8 Xinchen Hui: Added tests phpt
7 Xinchen Hui: Added supporting for slience token(@
6 Xinchen Hui: Updated sencode patch
5 Xinchen Hui: Added opcodes with silent token
4 Xinchen Hui: Updated patches that fixed a bug: znodeEA may be depend on an uninitialized value (thanks to Felipe
3 Phidev: Rewrote the RFC
2 Xinchen Hui: Open voting
10 Xinchen Hui: Initial RFC creation
1 Xinchen Hui: Close voting

Votes

An option needs 50%+1 votes to win

Should this RFC be merged into trunk? (73.3% approved)
User Vote
aharvey No
derick Yes
googleguy No
hradtke Yes
ircmaxell Yes
kassner Yes
kriscraig Yes
laruence Yes
levim Yes
nikic Yes
rdohms Yes
seld Yes
stas No
willfitch No
zhangzhenyu Yes
Should this RFC(with supporting of silent token) be merged into trunk? (16.7% approved)
User Vote
aharvey No
googleguy No
ircmaxell No
kassner No
kriscraig Yes
laruence Yes
levim No
nikic No
rdohms No
stas No
willfitch No
zhangzhenyu No