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
rfc:argument_unpacking [2013/12/21 12:44] – one more example nikicrfc:argument_unpacking [2017/09/22 13:28] (current) – external edit 127.0.0.1
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)