Table of 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

Vote

Should this RFC be merged into trunk?
Real name
Yes
No
 
 
 
 
 
 
 
 
 
Final result:
11
4
Should this RFC(with supporting of silent token) be merged into trunk?
Real name
Yes
No
 
 
 
 
 
 
Final result:
2
10

Changelog