rfc:spread_operator_for_array

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:spread_operator_for_array [2019/04/04 13:55] – v0.2 jhdxrrfc:spread_operator_for_array [2019/05/13 12:45] (current) – Implemented nikic
Line 3: Line 3:
   * Date: 2018-10-13   * Date: 2018-10-13
   * Author: CHU Zhaowei, jhdxr@php.net   * Author: CHU Zhaowei, jhdxr@php.net
-  * Status: Under discussion+  * Status: Implemented (in PHP 7.4)
   * First Published at: http://wiki.php.net/rfc/spread_operator_for_array   * First Published at: http://wiki.php.net/rfc/spread_operator_for_array
  
Line 22: Line 22:
  
 Spread operator works for both array syntax(''array()'') and short syntax(''[]''). Spread operator works for both array syntax(''array()'') and short syntax(''[]'').
 +
 +It's also possible to unpack array returned by a function immediately.
 +
 <code php> <code php>
 $arr1 = [1, 2, 3]; $arr1 = [1, 2, 3];
Line 27: Line 30:
 $arr3 = [0, ...$arr1]; //[0, 1, 2, 3] $arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
 $arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111] $arr4 = array(...$arr1, ...$arr2, 111); //[1, 2, 3, 1, 2, 3, 111]
 +$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]
 +
 +function getArr() {
 +  return ['a', 'b'];
 +}
 +$arr6 = [...getArr(), 'c']; //['a', 'b', 'c']
 +
 +$arr7 = [...new ArrayIterator(['a', 'b', 'c'])]; //['a', 'b', 'c']
 +
 +function arrGen() {
 + for($i = 11; $i < 15; $i++) {
 + yield $i;
 + }
 +}
 +$arr8 = [...arrGen()]; //[11, 12, 13, 14]
 </code> </code>
 +
  
 ==== String keys ==== ==== String keys ====
  
-In order to make the behavior consistent with [[rfc:argument_unpacking|argument unpacking]], string keys are not supported.+In order to make the behavior consistent with [[rfc:argument_unpacking|argument unpacking]], string keys are not supported. A recoverable error will be thrown once a string key is encountered.
  
 ==== By-reference passing ==== ==== By-reference passing ====
Line 37: Line 56:
 <code php> <code php>
 $arr1 = [1, 2, 3]; $arr1 = [1, 2, 3];
-$arr2 = [...&$arr1]; //invalid+$arr2 = [...&$arr1]; //invalid syntax
 </code> </code>
  
Line 65: Line 84:
 ===== Q & A ===== ===== Q & A =====
 ==== Advantages over array_merge ==== ==== Advantages over array_merge ====
-  - Spread operator should have a better performance than ''array_merge''. It'becuase not only that spread operator is a language structure while ''array_merge'' is a function call, but also compile time optimiztion can be performaned for constant arrays. +  - Spread operator should have a better performance than ''array_merge''. It'because not only that spread operator is a language structure while ''array_merge'' is a function call, but also compile time optimization can be performant for constant arrays. 
-  - ''array_merge'' only supports array, while spread operator also supportes objects implementing ''Traversable''+  - ''array_merge'' only supports array, while spread operator also supports objects implementing ''Traversable''. 
 +<PHP> 
 +// Before 
 +array_merge(iterator_to_array($iter1), iterator_to_array($iter2))
  
-==== ''...'' should be preserved for other use (e.g. map concat) ====+// Or to generalize to all iterables 
 +array_merge( 
 +  is_array($iter1) ? $iter1 : iterator_to_array($iter1), 
 +  is_array($iter2) ? $iter2 : iterator_to_array($iter2) 
 +
 + 
 +// After (handles both cases) 
 +[ ...$iter1, ...$iter2 ] 
 + 
 +//Thanks Rowan for providing this example 
 +</PHP> 
 + 
 +==== ... should be preserved for other use (e.g. map concat) ====
 This is kind of out of scope here to discuss other concat / merge operation. The important thing is we should make the behavior of same operator consistent and not to confuse userland developer. It's also why I changed the behavior for string keys in this revised version. This is kind of out of scope here to discuss other concat / merge operation. The important thing is we should make the behavior of same operator consistent and not to confuse userland developer. It's also why I changed the behavior for string keys in this revised version.
  
Line 76: Line 110:
 ===== RFC Impact ===== ===== RFC Impact =====
 ==== To Opcache ==== ==== To Opcache ====
-I'm not sure if this RFC will have any impact on Opcache. I'll check it after I finish the patch.+Some changes in opcache to support the new opcode is needed. 
  
 +===== Vote =====
 +Voting started 2019-04-22 and ends 2019-05-06. A 2/3 majority is required.
  
-===== Proposed Voting Choices ===== +<doodle title="Support spread operator for array definition in PHP 7.4?" auth="jhdxr" voteType="single" closed="true"> 
-As this is a language change, a 2/3 majority is required. +   * Yes 
 +   * No 
 +</doodle>
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
rfc/spread_operator_for_array.1554386119.txt.gz · Last modified: 2019/04/04 13:55 by jhdxr