rfc:argument_unpacking

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:argument_unpacking [2013/12/21 12:44] – one more example nikicrfc:argument_unpacking [2014/07/31 20:32] – fix now invalid code nikic
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.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1