rfc:additional-splat-usage

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:additional-splat-usage [2014/11/03 22:48] daverandomrfc:additional-splat-usage [2021/06/09 16:03] (current) – Status set to inactive for consistency, it was already part of the "Inactive" list patrickallaert
Line 1: Line 1:
 ====== PHP RFC: Additional Usage for the Splat Operator ====== ====== PHP RFC: Additional Usage for the Splat Operator ======
-  * Version: 0.2+  * Version: 1.1
   * Date: 2014-11-03   * Date: 2014-11-03
-  * Author: Chris Wright, daverandom@php.net +  * Author: Chris Wright, daverandom@php.net, Marcelo Camargo, João Lucchetta 
-  * Status: Under Discussion+  * Status: Inactive
   * First Published at: http://wiki.php.net/rfc/additional-splat-usage   * First Published at: http://wiki.php.net/rfc/additional-splat-usage
  
Line 10: Line 10:
  
 ===== Proposal ===== ===== Proposal =====
-The argument unpacking operator ''...$var'' (hereafter referred to as the "splat" operator) currently permits unpacking arrays into an argument list when variadic functions are called, as well as collecting variadic arguments into an array in the callee. However, there are other cases where it can make sense to use a similar construct for brevity and readability. This RFC covers one of these cases which is commonly available in other languages that support a similar operator.+The argument unpacking operator ''...$var'' (hereafter referred to as the "splat" operator) currently permits unpacking arrays into an argument list when variadic functions are called, as well as collecting variadic arguments into an array in the callee. However, there are other cases where it can make sense to use a similar construct for brevity and readability. This RFC covers one of these cases which is commonly available in other languages that support a similar operator. This feature is already supported by ECMAScript 6.
  
 ==== Combining arrays in literal declaration syntax ==== ==== Combining arrays in literal declaration syntax ====
Line 22: Line 22:
 </code> </code>
  
-''array_merge()'' is quite verbose and carries the overheads of invoking a function. The ''+'' operator is not always suitable for such an operation and has a cognitive overhead when reading the code, because of the differences in behaviour from ''array_merge()''.+''array_merge()'' is quite verbose and carries the overheads of invoking a function. The ''+'' operator is not always suitable for such an operation and has a cognitive overhead when reading the code, because of the differences in behaviour from ''array_merge()'' and may be confusing because you don't always know if you are dealing with arrays or numbers.
  
 This RFC proposes allowing the splat operator to be used in array literals as another way to perform this operation: This RFC proposes allowing the splat operator to be used in array literals as another way to perform this operation:
Line 32: Line 32:
  
 The new syntax gives equivalent behaviour to the ''array_merge()'' example above, where the contents of ''$arr1'' are appended to the array literal, and stored in ''$arr2''. The same rules for merging are followed; in the case of duplicated string keys, the later value overwrites the earlier when read from left to right, and numerically indexed arrays are appropriately re-keyed and appended. Any number of variables can be unpacked at any position in the array literal, and may be combined with regular element declarations in any order. The new syntax gives equivalent behaviour to the ''array_merge()'' example above, where the contents of ''$arr1'' are appended to the array literal, and stored in ''$arr2''. The same rules for merging are followed; in the case of duplicated string keys, the later value overwrites the earlier when read from left to right, and numerically indexed arrays are appropriately re-keyed and appended. Any number of variables can be unpacked at any position in the array literal, and may be combined with regular element declarations in any order.
 +
 +As such, the following application of ''array_merge()'' and of the splat operator and  should be equivalent:
 +<code php>
 +$array1 = ["color" => "red", "model" => "Corolla"];
 +$array2 = ["type" => "car", "year" => "2002"];
 +
 +$result = array_merge($array1, $array2);
 +$result2 = [...$array1, ...$array2];
 +</code>
 +
 +A mixture of applying the splat operator to previously assigned variables and other literal should work just as fine:
 +<code php>
 +$array1 = ["color" => "red", "model" => "Corolla"];
 +$array2 = ["type" => "car", "year" => "2002"];
 +
 +$result = array_merge($array1, ["category" => "suv", "condition" => "good"], $array2);
 +$result2 = [...$array1, ...["category" => "suv", "condition" => "good"], ...$array2];
 +</code>
 +
 +The operator should have the same behaviour for numeric and associative arrays. 
 +Multidimensional arrays should not be flattened: the splat operator should have effect in the first level keys only.
 +
 +=== Numeric ===
 +
 +<code php>
 +$threetofive = [3,4,5];
 +$zerotofive = [0, 1, 2, ...$threetofive];
 +</code>
 +
 +=== Associative ===
 +
 +<code php>
 +$addressData = ["street" => "George St.", "number" => 2];
 +$cityData = ["city" => "Brisbane", "postcode" => 4000];
 +
 +$propertyData = ["name" => "QUT", ...$addressData, ...$cityData];
 +</code>
 +
 +=== Multidimensional ===
 +
 +<code php>
 +$old_marks = [
 + "john" => [
 +    "maths" => 0,
 +    "english" => 8
 + ],
 + "jane" => [
 +    "maths" => 10,
 +    "english" => 7
 + ],
 + "joe" => [
 +    "maths" => 0,
 +    "english" => 8
 +  ]
 +];
 +
 +$new_marks = [
 +  "matthew" => [
 +    "maths" => 5,
 +    "english" => 5
 +  ],
 +  ...$old_marks
 +]; /* array(4) { ["matthew"]=> ... ["john"]=> ... ["jane"]=> ... ["joe"]=> ... }*/
 +</code>
 +
 +
 +Using the splat operator with elements that are not arrays and not ''Traversable'' should cause an error.
  
 ===== Backward Incompatible Changes ===== ===== Backward Incompatible Changes =====
Line 37: Line 104:
  
 ===== Proposed PHP Version(s) ===== ===== Proposed PHP Version(s) =====
-This RFC targets PHP 7.+This RFC targets PHP 7.2.
  
 ===== RFC Impact ===== ===== RFC Impact =====
Line 73: Line 140:
  
 ===== Proposed Voting Choices ===== ===== Proposed Voting Choices =====
-Simple yes/no. As this is a language change, the vote would require a 2/3 majority in favour to pass.+Extend the splat operator usage yes/no? Requires a 2/3 + 1 majority.
  
 ===== Patches and Tests ===== ===== Patches and Tests =====
-Nikita Popov has offered to provide an implementation for this feature, should this RFC be accepted.+Marcelo Camargo is currently writing a patch for this RFC.
  
 ===== References ===== ===== References =====
Line 82: Line 149:
   * [[https://wiki.php.net/rfc/argument_unpacking|Argument unpacking RFC]]   * [[https://wiki.php.net/rfc/argument_unpacking|Argument unpacking RFC]]
   * [[https://wiki.php.net/rfc/variadics|Variadics RFC]]   * [[https://wiki.php.net/rfc/variadics|Variadics RFC]]
 +  * [[https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator]]
rfc/additional-splat-usage.1415054911.txt.gz · Last modified: 2017/09/22 13:28 (external edit)