rfc:argument_unpacking

Differences

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

Link to this comparison view

rfc:argument_unpacking [2013/09/23 21:38]
nikic make the example for multiple ... and mixing a bit less contrived
rfc:argument_unpacking [2014/02/26 16:56] (current)
nikic Don't allow arguments after unpack
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/​nikic/php-src/compare/variadics...splat+
   * 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 94: Line 99:
 </​code>​ </​code>​
  
-By-reference passing will not work if the unpacked entity is a Traversable. Instead an ''​E_STRICT''​ level error is thrown and the argument is passed by-value instead:+By-reference passing will not work if the unpacked entity is a Traversable. Instead an ''​E_WARNING''​ level error is thrown and the argument is passed by-value instead:
  
 <code php> <code php>
 test(...new ArrayIterator([1,​ 2, 3, 4, 5])); test(...new ArrayIterator([1,​ 2, 3, 4, 5]));
-// Strict standards: Cannot pass by-reference argument 3 of test() by unpacking a Traversable,​ passing by-value instead+// Warning: Cannot pass by-reference argument 3 of test() by unpacking a Traversable,​ passing by-value instead
 </​code>​ </​code>​
  
Line 105: Line 110:
   * It's not possible to determine the number of elements in a Traversable ahead of time. As such we can not know whether unpacking the Traversable will or will not hit a by-reference argument.   * It's not possible to determine the number of elements in a Traversable ahead of time. As such we can not know whether unpacking the Traversable will or will not hit a by-reference argument.
   * It's not possible to determine if a Traversable has support for by-reference iteration or if it will trigger an error if this is requested.   * It's not possible to determine if a Traversable has support for by-reference iteration or if it will trigger an error if this is requested.
 +
 +==== String keys ====
 +
 +In order to ensure forward-compatibility with [[rfc:​named_params|named arguments]] the unpacking operator does not support string keys. If a string key is encountered during unpacking a recoverable error is thrown. If the error is ignored using a custom error handler, no further arguments will be unpacked but the call still happens.
  
 ===== Backward Compatibility ===== ===== Backward Compatibility =====
Line 214: Line 223:
 ===== Patch ===== ===== Patch =====
  
-The diff can be found here: https://​github.com/​nikic/php-src/compare/variadics...splat+The patch for this features is available as a PR: https://​github.com/​php/php-src/pull/477 
 + 
 +===== Vote ===== 
 + 
 +As this is a language change a two third majority is required. 
 + 
 +Voting started 2013-12-21 and ended 2014-01-11.
  
-The patch is based off the variadics implementation,​ but can also be implemented without it.+<doodle title="​Implement argument unpacking in PHP 5.6?" auth="​nikic"​ voteType="​single"​ closed="​true">​ 
 +   * Yes 
 +   * No 
 +</​doodle>​
  
 ===== Support in other languages ===== ===== Support in other languages =====
rfc/argument_unpacking.1379965132.txt.gz · Last modified: 2013/09/23 21:38 by nikic