rfc:skipparams
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
rfc:skipparams [2012/05/11 23:15] – [User request examples] stas | rfc:skipparams [2015/01/03 01:28] – stas | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Skipping optional parameters for functions ====== | ====== Skipping optional parameters for functions ====== | ||
- | * Version: | + | * Version: |
- | * Date: 2012-04-13 | + | * Date: 2013-09-01 |
* Author: Stas Malyshev < | * Author: Stas Malyshev < | ||
* Status: Under Discussion | * Status: Under Discussion | ||
- | * Implementation: | + | * Implementation: |
===== Introduction ===== | ===== Introduction ===== | ||
Line 19: | Line 18: | ||
The proposal is to allow skipping optional arguments in a call, thus making them assume default values as they do when they are not provided, like this: | The proposal is to allow skipping optional arguments in a call, thus making them assume default values as they do when they are not provided, like this: | ||
- | create_query(" | + | create_query(" |
This means that $join_type and $execute are going to use defaults. | This means that $join_type and $execute are going to use defaults. | ||
Of course, if we ever get implementation of named parameters, it may also solve this problem, but until we do, this can be a partial solution. | Of course, if we ever get implementation of named parameters, it may also solve this problem, but until we do, this can be a partial solution. | ||
- | Only optional parameters can be skipped this way, skipping non-optional one will produce the same error it does now when function is not given engough | + | Only declared |
===== Implementation ===== | ===== Implementation ===== | ||
- | On the engine level, it will be implemented by putting | + | On the engine level, it will be implemented by putting |
- | See example implementation | + | See example implementation |
===== User functions ===== | ===== User functions ===== | ||
Line 38: | Line 37: | ||
===== Internal functions ===== | ===== Internal functions ===== | ||
- | For internal functions, parameter parser will ignore the NULLs, thus leaving the defaults supplied by the caller intact. Again, skipping non-optional parameter is an error. | + | For internal functions, parameter parser will ignore the skipped parameters, thus leaving the defaults supplied by the caller intact. Again, skipping non-optional parameter is an error. For variadic parameters, as per above, skipping is not allowed, unless specifically requested by function declaration. |
- | Variadic functions will not return skipped parameters in argc and argv, effectively ignoring them, so: | + | Thus, this code is an error: |
- | | + | |
- | is the same as: | + | but this is not: |
- | var_dump(2,1); | + | call_user_func(' |
+ | |||
+ | since call_user_func is specifically described as accepting defaults. | ||
===== func_get_args() ===== | ===== func_get_args() ===== | ||
- | func_get_args() will skip parameters that are not supplied, | + | func_get_args() will use default values for parameters that are not supplied. Because of how PHP 7 engine works, it is not possible |
- | + | ||
- | | + | |
- | var_dump(func_get_args()); | + | |
- | } | + | |
- | + | ||
- | | + | |
- | + | ||
- | will produce: | + | |
- | + | ||
- | array(2) { | + | |
- | [0]=> | + | |
- | int(1) | + | |
- | [2]=> | + | |
- | int(4) | + | |
- | } | + | |
- | + | ||
- | This means that if you are looping over func_get_args() result, you should use foreach() and not counter-based for(). | + | |
- | func_num_args() will also ignore | + | |
- | func_get_arg() will return false for parameter that was not passed. | + | |
===== call_user_func_array() ===== | ===== call_user_func_array() ===== | ||
- | call_user_func_array() will allow skipping | + | Currently, |
- | call_user_func_array(' | + | ===== Internal API changes ===== |
+ | Parameters stored as array of zvals n the engine. For skipped parameter, the zval type is stored as IS_UNDEF. | ||
- | call_user_func | + | zend_parse_parameter() would ignore parameters marked as skipped/ |
- | call_user_func(' | + | If certain function wants to disallow skipping parameters, it should use option ZEND_PARSE_PARAMS_NODEFAULT with zend_parse_parameters_ex(). This may be when internal function has optional arguments but does not have any defaults for them. In this case, skipped parameters will cause a catchable fatal error. |
- | with the same result. | + | ZEND_NUM_ARGS() is always |
===== User request examples ===== | ===== User request examples ===== | ||
Line 93: | Line 76: | ||
* http:// | * http:// | ||
* http:// | * http:// | ||
+ | * http:// | ||
===== Issues raised ===== | ===== Issues raised ===== | ||
- | * Using " | + | |
- | * Support for internal | + | * Internal |
===== Changelog ===== | ===== Changelog ===== | ||
- | * 2012-04-13 First draft. | + | |
+ | * 2012-07-07 Changed empty parameter to use ' | ||
+ | * 2013-09-01 Added Zend API description | ||
+ | * 2015-01-01 Updated for PHPNG |
rfc/skipparams.txt · Last modified: 2017/09/22 13:28 by 127.0.0.1