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
Next revisionBoth sides next revision
rfc:argument_unpacking [2013/09/23 19:38] – make the example for multiple ... and mixing a bit less contrived nikicrfc:argument_unpacking [2014/01/11 12:12] – -> Implemented 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/nikic/php-src/compare/variadics...splat+
   * Mailing list discussion: http://markmail.org/message/dxae5ybjldg6pftp   * Mailing list discussion: http://markmail.org/message/dxae5ybjldg6pftp
  
Line 94: Line 93:
 </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 104:
   * 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 210: Line 213:
     }     }
 } }
 +</code>
 +
 +==== Normal arguments after unpacked arguments ====
 +
 +Some people also had doubts regarding the usefulness of allowing ''%%foo(...$args, $arg)%%'' calls, where a normal argument follows after an unpacked argument.
 +
 +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:
 +
 +<code php>
 +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.
 +
 +Another use case is appending one additional argument to a variadic argument list. For example, the following snippet adds an additional ''LIMIT'' parameter to an existing query:
 +
 +<code php>
 +$this->query($query . ' LIMIT ?', ...$params, $limit);
 </code> </code>
  
 ===== 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.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1