问题
Is it possible in php like in python to have named function parameters? An example use case is:
function foo($username = "", $password = "", $timeout = 10) {
}
I want to override $timeout:
foo("", "", 3);
Ugly. I would much rather do:
foo(timeout=3);
回答1:
No, named parameters are not possible in PHP. Technically when you call foo($timeout=3) it is evaluating $timeout=3 first, with a result of 3 and passing that as the first parameter to foo(). And PHP enforces parameter order, so the comparable call would need to be foo("", "", $timeout=3). You have two other options:
- Have your function take an array as parameter and check the array keys. I personally find this ugly but it works and is readable. Upside is simplicity and it's easy to add new parameters later. Downside is your function is less self-documenting and you won't get much help from IDEs (autocomplete, quick function param lookups, etc.).
- Set up the function with no parameters and ask PHP for the arguments using func_get_args() or use the
...variable length arguments feature in PHP 5.6+. Based on the number of parameters you can then decide how to treat each. A lot of JQuery functions do something like this. This is easy but can be confusing for those calling your functions because it's also not self-documenting. And your arguments are still not named.
Note there is an RFC for named parameters still "under discussion".
回答2:
Old question, but here is some more information.
As stated in the other answers, PHP does not directly support named parameters. VBA is another language which has that luxury.
In PHP, you can use a fairly reasonable substitute. PHP’s array handling is particularly good, and you can use an associative array to pass an array of parameters, as follows:
function foo($parms=[]) {
$username = parms['username']?:'…';
$password = parms['password']?:'…';
$timeout = parms['timeout']?:'…';
}
foo(['timeout'=>10]);
Note the use of the ?: operator to allow a simple default if the input array element doesn’t exist.
Not as slick, but named parameters have another important role: they allow you to work with a large number of options without an excessively long list of ordered parameters.
An alternative way of writing the function is to use the `extract function:
function foo($parms=[]) {
$username = '…';
$password = '…';
$timeout = '…';
extract($parms,EXTR_IF_EXISTS);
}
Here the extract function copies the values into the variables, but only if they have already been defined. This prevents importing variables you didn’t know about.
回答3:
you should use other parameters order
foo($timeout=3,$username='',$password='')
or think about using
func_get_args
来源:https://stackoverflow.com/questions/19126860/named-function-parameters-in-php