rfc:list_reference_assignment

This is an old revision of the document!


PHP RFC: list() Reference Assignment

Introduction

PHP has had list() assignment and reference assignment for a long time. However, it is not currently possible to use reference assignment with list(). This RFC proposes this new syntax to cover this. The original requests for this feature date back at least 16 years now [1][2]. We will be focusing on the formers syntax proposal for this RFC.

Proposal

Under this proposal, a new syntax is introduced:

$array = [1, 2];
list($a, &$b) = $array;

This would be equivalent to the following:

$array = [1, 2];
$a = $array[0];
$b = &$array[1];

Of course, this works just like list() normally does, so you can use it with nested list() and skip values as well:

$array = [1, 2, 3, [3, 4]];
list(&$a, $b,, list(&$c, $d)) = $array;

It also works with foreach():

$array = [[1, 2], [3, 4]];
foreach ($array as list(&$a, $b)) {
    $a = 7;
}

The advantage of adding support for this is that it allows you to use reference assignment for multiple variables at once, which is not currently possible. The syntax here is different from the traditional assignment syntax which places the & before the rvar, not the lvar, but the advantage here is that you can reference assign some, but not all of the variables in list().

Backward Incompatible Changes

This introduces no backwards incompatible changes.

Proposed PHP Version(s)

PHP 7.2

RFC Impact

To Opcache

I'm assuming yes, I'm not familiar with opcache. Changes were made to vm_def, and a new extended value is used.

Open Issues

Proposed Voting Choices

Will require 2/3

Patches and Tests

Implementation

Link to commit and docs when completed.

References

Rejected Features

Change Log

  • v2.0 - Commandeered for revival for PHP 7 implementation.
  • v1.0(and prior) - Initial concept raised for PHP 5.x. Was withdrawn in 2014.
rfc/list_reference_assignment.1483154812.txt.gz · Last modified: 2017/09/22 13:28 (external edit)