rfc:list_reference_assignment

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
rfc:list_reference_assignment [2016/12/31 17:34] bp1222rfc:list_reference_assignment [2017/12/09 12:43] (current) – Implemented nikic
Line 6: Line 6:
   * Original Date: 2013-10-24   * Original Date: 2013-10-24
   * Original Author: Andrea Faulds, ajf@ajf.me   * Original Author: Andrea Faulds, ajf@ajf.me
-  * Status: Under Discussuon+  * Status: Implemented (in PHP 7.3)
   * First Published at: http://wiki.php.net/rfc/list_reference_assignment   * First Published at: http://wiki.php.net/rfc/list_reference_assignment
  
Line 26: Line 26:
 $a = $array[0]; $a = $array[0];
 $b =& $array[1]; $b =& $array[1];
 +</code>
 +
 +<code php>
 +/* Note; []= syntax works the same, so the following is functionally equivalent to the example */
 +[$a, &$b] = $array;
 </code> </code>
  
Line 82: Line 87:
 (notice here that the reference exists on ''$array[1][0]'' since $a is still in scope after the foreach()) (notice here that the reference exists on ''$array[1][0]'' since $a is still in scope after the foreach())
  
-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(). 
  
-The RFC also takes into account the possibility of objects being the lval of the assignment implementing ArrayAccess.+The predominant 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 right-side value, not the left-side value; the advantage here is that you can reference assign some, but not all of the variables in list(). 
 + 
 +The RFC also takes into account the possibility of objects being the r-val of the assignment implementing ArrayAccess.
 <code php> <code php>
 class RefArr implements ArrayAccess { class RefArr implements ArrayAccess {
Line 124: Line 130:
 ===== RFC Impact ===== ===== RFC Impact =====
 ==== To Opcache ==== ==== 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.+Maybe, I don't know enough about opcache to say if changing current ops by adding an extended value would impact.
  
-===== Open Issues ===== +===== Proposed Voting Choices ===== 
-==== Multi Layer list() ==== +Voting starts on 2017-02-06 17:30 UTC and closes on 2017-02-22 20:00 UTC
-Not knowing if multiple layers of lists() below may include a reference, it's hard to determine if one of them is going to assign by reference +
-<code php> +
-$a = [1, 2]; +
-list($one, $two, list($three)) = $a; +
-/* +
-NoticeUndefined offset2 in /Users/dwalker/src/php/e.php on line 3 +
-array(3) { +
-  [0]=> +
-  int(1) +
-  [1]=> +
-  int(2) +
-  [2]=> +
-  NULL +
-+
-*/+
  
-list($one, $two, list(&$three)) = $a; +2/3 Vote Required 
-var_dump($a); +Vote Yes to allow reference assignments as part of list() assignments 
-/* +Vote No to maintain current functionality
-Notice: Undefined offset: in /Users/dwalker/src/php/e.php on line +
-Notice: Undefined offset: 0 in /Users/dwalker/src/php/e.php on line 3 +
-array(3{ +
-  [0]=> +
-  int(1) +
-  [1]=> +
-  int(2) +
-  [2]=> +
-  array(1) { +
-    [0]=> +
-    &NULL +
-  } +
-+
-*/+
  
-===== Proposed Voting Choices ===== +<doodle title="list() Reference Assignments" auth="bp1222" voteType="single" closed="true"> 
-Will require 2/3+   * Yes 
 +   * No 
 +</doodle>
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
-  * Working Implementation: https://github.com/php/php-src/compare/master...bp1222:fix-7930+  * Working Implementation: https://github.com/php/php-src/pull/2371
   * Language Spec: https://github.com/php/php-langspec/compare/master...bp1222:fix-7930   * Language Spec: https://github.com/php/php-langspec/compare/master...bp1222:fix-7930
  
 ===== Implementation ===== ===== Implementation =====
-Link to commit and docs when completed.+ 
 +Implemented in PHP 7.3 via https://github.com/php/php-src/commit/6d4de4cf0582cf33848826ab78aae58077dc2dea.
  
 ===== References ===== ===== References =====
rfc/list_reference_assignment.1483205666.txt.gz · Last modified: 2017/09/22 13:28 (external edit)