rfc:argument_unpacking

Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
rfc:argument_unpacking [2013/12/21 12:44]
nikic one more example
rfc:argument_unpacking [2017/09/22 13:28] (current)
Line 2: Line 2:
   * Date: 2013-08-30   * Date: 2013-08-30
   * Author: Nikita Popov <​nikic@php.net>​   * Author: Nikita Popov <​nikic@php.net>​
-  * Status: ​Under Discussion +  * Status: ​Implemented (in PHP 5.6)
-  * Proposed for: PHP 5.6+
   * Patch: https://​github.com/​php/​php-src/​pull/​477   * Patch: https://​github.com/​php/​php-src/​pull/​477
   * Mailing list discussion: http://​markmail.org/​message/​dxae5ybjldg6pftp   * Mailing list discussion: http://​markmail.org/​message/​dxae5ybjldg6pftp
Line 40: Line 39:
 </​code>​ </​code>​
  
-It's possible to use ''​%%...%%''​ multiple times in a call and it is possible to mix it with normal arguments:+It's possible to use ''​%%...%%''​ multiple times in a call and it is possible to use normal arguments ​before argument unpacking:
  
 <code php> <code php>
Line 47: Line 46:
 test(...$args1,​ ...$args2); // [1, 2, 3, 4, 5, 6] test(...$args1,​ ...$args2); // [1, 2, 3, 4, 5, 6]
 test(1, 2, 3, ...$args2); ​  // [1, 2, 3, 4, 5, 6] test(1, 2, 3, ...$args2); ​  // [1, 2, 3, 4, 5, 6]
-test(...$args1,​ 4, 5, 6);   // [1, 2, 3, 4, 5, 6]+</​code>​ 
 + 
 +However, it is not possible to use normal arguments after argument unpacking was used. Both of the following are invalid: 
 + 
 +<code php> 
 +test(...$args1,​ 4, 5, 6); 
 +test(...$args1, 4, 5, 6, ...$args2);
 </​code>​ </​code>​
  
Line 75: Line 80:
  
 <code php> <code php>
-var_dump(1, 2, ...null, 3, 4);+var_dump(1, 2, ...null, ​...[3, 4]);
 // Warning: Only arrays and Traversables can be unpacked // Warning: Only arrays and Traversables can be unpacked
 // int(1) int(2) int(3) int(4) // int(1) int(2) int(3) int(4)
Line 216: Line 221:
 </​code>​ </​code>​
  
-==== Normal arguments after unpacked arguments ​====+===== Patch =====
  
-Some people also had doubts regarding the usefulness of allowing ''​%%foo(...$args,​ $arg)%%''​ calls, where normal argument follows after an unpacked argument.+The patch for this features is available as PR: https://​github.com/​php/​php-src/​pull/​477
  
-One use-case for this pattern are the variants of ''​array_diff''​ and ''​array_intersect''​ which accept callback functions as the **last** one or two arguments:+===== Vote =====
  
-<code php> +As this is a language change a two third majority is required.
-array_udiff(...$arrays, $valueCmpFunction);​ +
-array_udiff_uassoc(...$arrays,​ $valueCmpFunction,​ $keyCmpFunction);​ +
-</​code>​+
  
-While this kind of API was undoubtedly a bad choice in the first place, I see little reason not to support calls to them.+Voting started 2013-12-21 and ended 2014-01-11.
  
-Another use case is appending one additional ​argument ​to a variadic argument listFor example, the following snippet adds an additional ''​LIMIT''​ parameter to an existing query: +<doodle title="​Implement ​argument ​unpacking in PHP 5.6?" auth="​nikic"​ voteType="​single"​ closed="​true">​ 
- +   * Yes 
-<code php> +   * No 
-$this->​query($query . ' LIMIT ?', ...$params, $limit); +</doodle>
-</​code>​ +
- +
-===== Patch ===== +
- +
-The patch for this features is available as a PR: https://​github.com/​php/​php-src/​pull/​477+
  
 ===== Support in other languages ===== ===== Support in other languages =====
rfc/argument_unpacking.1387629874.txt.gz · Last modified: 2017/09/22 13:28 (external edit)