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
Last revisionBoth sides next revision
rfc:spread_operator_for_array [2019/04/04 13:55] – v0.2 jhdxrrfc:spread_operator_for_array [2019/05/09 11:14] – Accepted 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: Accepted
   * 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.txt · Last modified: 2019/05/13 12:45 by nikic