PHP Default Function Parameter values, how to 'pass default value' for 'not last' parameters?
PHP doesn't support what you're trying to do. The usual solution to this problem is to pass an array of arguments:
function funcName($params = array())
{
$defaults = array( // the defaults will be overidden if set in $params
'value1' => '1',
'value2' => '2',
);
$params = array_merge($defaults, $params);
echo $params['value1'] . ', ' . $params['value2'];
}
Example Usage:
funcName(array('value1' => 'one')); // outputs: one, 2
funcName(array('value2' => 'two')); // outputs: 1, two
funcName(array('value1' => '1st', 'value2' => '2nd')); // outputs: 1st, 2nd
funcName(); // outputs: 1, 2
Using this, all arguments are optional. By passing an array of arguments, anything that is in the array will override the defaults. This is possible through the use of array_merge()
which merges two arrays, overriding the first array with any duplicate elements in the second array.
Unfortunately, this is not possible. To get around this, I would suggest adding the following line to your function:
$param1 = (is_null ($param1) ? 'value1' : $param1);
You can then call it like this:
funcName (null, 'non default');
Result:
value1
non default
PHP 8.0 update
Solution you want is available since PHP 8.0: named arguments
function funcName($param1 = 'value1', $param2 = 'value2', $param3 = 'value3') {
...
}
Previously you had to pass some value as $param1
, either null or default value, but now you can only pass a second parameter.
funcName(param2: 'value');
And you don't need to care about argument order.
funcName(param2: 'value', param3: 'value');
//is the same as
funcName(param3: 'value', param2: 'value');
Moreover there are some fancy things we can do with named arguments, like passing an array as arguments. It's helpful when we don't know which exact keys we store in an array and we don't need to worry about the order of variables anymore.
$args = [
'param3' => 'value',
'param2' => 'value',
];
funcName(...$args);
//works the same as
funcName(param2: 'value', param3: 'value');
We even don't need to name our values in an array as arguments (of course until we match order of arguments).
$args = [
'value1',
'param3' => 'value3',
'param2' => 'value2',
];
funcName(...$args);
//works the same as
funcName(param1: 'value1', param3: 'value3', param2: 'value2');
//and
funcName('value1', 'value2', 'value3');