我有这个:
function foo($a='apple', $b='brown', $c='Capulet') {
// do something
}
这样的事情可能吗:
foo('aardvark', <use the default, please>, 'Montague');
我有这个:
function foo($a='apple', $b='brown', $c='Capulet') {
// do something
}
这样的事情可能吗:
foo('aardvark', <use the default, please>, 'Montague');
如果它是您的函数,您可以使用null
通配符并稍后在函数内设置默认值:
function foo($a=null, $b=null, $c=null) {
if (is_null($a)) {
$a = 'apple';
}
if (is_null($b)) {
$b = 'brown';
}
if (is_null($c)) {
$c = 'Capulet';
}
echo "$a, $b, $c";
}
然后您可以使用以下命令跳过它们null
:
foo('aardvark', null, 'Montague');
// output: "aarkvark, brown, Montague"
如果它是您自己的函数而不是 PHP 的核心之一,您可以这样做:
function foo($arguments = []) {
$defaults = [
'an_argument' => 'a value',
'another_argument' => 'another value',
'third_argument' => 'yet another value!',
];
$arguments = array_merge($defaults, $arguments);
// now, do stuff!
}
foo(['another_argument' => 'not the default value!']);
您几乎找到了答案,但学术/高级方法是函数柯里化,老实说,我从来没有发现它有多大用处,但知道存在是有用的。
您可以使用一些怪癖,或者像ceejayoz建议的那样将所有参数作为数组传递,或者使用一些过于复杂的代码来解析 func_get_args() 并与默认值列表合并。不要复制粘贴它,您必须使用对象和特征。最后,为了能够传递所有类型的值(不排除 null 或 false,通过使它们成为默认参数替换的信号),您必须声明一个虚拟的特殊类型 DefaultParam。另一个缺点是,如果您想在任何 IDE 中获得类型提示或帮助,您必须在函数声明中复制名称和默认值。
class DefaultParam {}
trait multi_arg_functions
{
private static function multi_arg($defaults, $list, $preserve_index = false)
{
$arg_keys = array_slice(array_keys($defaults), 0, count($list));
if ($preserve_index) {
$listed_arguments = array_slice($list, 0, count($arg_keys));
$extras = array_slice($list, count($arg_keys), null, true);
} else {
$listed_arguments = array_splice($list, 0, count($arg_keys));
$extras = &$list;
}
unset($list);
$arguments = array_combine($arg_keys, $listed_arguments);
$arguments = array_filter($arguments, function ($entry) {
return !($entry instanceof DefaultParam); //remove entries that mean default, a special class in this case
});
$arguments = array_merge($defaults, $arguments);
return [$arguments, $extras];
}
}
class b {
use multi_arg_functions;
static function func1($an_argument = 'a value', $another_argument = 'another value', $third_argument = 'yet another value') { //give defaults here to get hints in an IDE
list($args, $extras) = self::multi_arg( //note: duplicate names and defaults
[
'an_argument' => 'a value',
'another_argument' => 'another value',
'third_argument' => 'yet another value!',
], func_get_args());
echo json_encode(['args' => $args, 'extras' => $extras])."\n";
}
}
$default_param = new DefaultParam();
b::func1('value 1');
b::func1('value 2', $default_param, 'third argument');
b::func1('value 3', $default_param, 'third argument', 'fourth argument');
注意:通过使用 preserve_index = true 您可以获得从原始索引开始的额外参数。
从 PHP 8 开始,使用命名参数:
function foo($a='apple', $b='brown', $c='Capulet') {
// do something
}
foo('apple', c:'Montague');
这让您可以绕过任意数量的参数,允许它们采用默认值。这对冗长的函数很有帮助,例如setcookie
:
setcookie('macadamia', httponly:true); // skips over 5 parameters
请注意,命名参数需要传递所有非可选参数。这些可以按位置传递(就像我在这里所做的那样,上面没有名字)或以任何顺序传递名字。