我建议按如下所示更改函数声明,以便您可以执行所需的操作:
function foo($blah, $x = null, $y = null) { if (null === $x) { $x = "some value"; } if (null === $y) { $y = "some other value"; } pre here!}这样,您可以像这样进行调用
foo('blah', null, 'non-default yvalue');并使它按需要工作,其中第二个参数$x仍将获得其默认值。
使用此方法,传递空值意味着要覆盖一个参数的默认值,而要覆盖其后的参数的默认值。
如其他答案所述,
默认参数仅用作该函数的最后一个参数。如果要在函数定义中声明默认值,则无法省略一个参数并在其后覆盖一个参数。
如果我有一个可以接受数量不定的参数以及类型不同的参数的方法,那么我通常会声明类似于Ryan P所示答案的函数。
这是另一个示例(虽然不能回答您的问题,但希望能为您提供有益的参考:
public function __construct($params = null){ if ($params instanceof SOMETHING) { // single parameter, of object type SOMETHING } else if (is_string($params)) { // single argument given as string } else if (is_array($params)) { // params could be an array of properties like array('x' => 'x1', 'y' => 'y1') } else if (func_num_args() == 3) { $args = func_get_args(); // 3 parameters passed } else if (func_num_args() == 5) { $args = func_get_args(); // 5 parameters passed } else { throw new InvalidArgumentException("Could not figure out parameters!"); }}


