我对PHP函数的默认值感到困惑。假设我有一个这样的函数:
function foo($blah, $x = "some value", $y = "some other value") {
// code here!
}
如果我想使用$x的默认参数,并为$y设置一个不同的参数呢?
我一直在尝试不同的方法,但我越来越困惑了。例如,我尝试了以下两种:
foo("blah", null, "test");
foo("blah", "", "test");
但这两种方法都不会为$x提供合适的默认参数。我还尝试通过变量名来设置它。
foo("blah", $x, $y = "test");
我满心期待这样的东西能起作用。但它完全不像我想象的那样。似乎无论我做什么,每次调用函数时,我都必须输入默认参数。我肯定遗漏了一些明显的东西。
我最近遇到了这个问题,找到了这个问题和答案。虽然上面的问题可以工作,但问题是它们不会向支持它的ide显示默认值(如PHPStorm)。
如果你使用null,你将不知道它的值是什么,如果你让它为空。
我更喜欢的解决方案是将默认值也放在函数定义中:
protected function baseItemQuery(BoolQuery $boolQuery, $limit=1000, $sort = [], $offset = 0, $remove_dead=true)
{
if ($limit===null) $limit =1000;
if ($sort===null) $sort = [];
if ($offset===null) $offset = 0;
...
唯一的区别是我需要确保它们是相同的-但我认为这是为额外的清晰度付出的一个小代价。
我建议修改函数声明如下,这样你就可以做你想做的事情:
function foo($blah, $x = null, $y = null) {
if (null === $x) {
$x = "some value";
}
if (null === $y) {
$y = "some other value";
}
code here!
}
这样,你可以调用foo('blah', null, '非默认y值');让它像你想要的那样工作,其中第二个参数$x仍然得到它的默认值。
使用此方法,传递空值意味着当您希望覆盖后面的参数的默认值时,需要一个参数的默认值。
如其他答案所述,
默认形参仅作为函数的最后一个实参。
如果你想在函数定义中声明默认值,
没有办法省略一个参数并覆盖它后面的一个参数。
如果我有一个方法可以接受不同数量的参数,以及不同类型的参数,我通常声明的函数类似于Ryan P。
下面是另一个例子(这不能回答你的问题,但希望能提供信息:
public function __construct($params = null)
{
if ($params instanceof SOMETHING) {
// single parameter, of object type SOMETHING
} elseif (is_string($params)) {
// single argument given as string
} elseif (is_array($params)) {
// params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
} elseif (func_num_args() == 3) {
$args = func_get_args();
// 3 parameters passed
} elseif (func_num_args() == 5) {
$args = func_get_args();
// 5 parameters passed
} else {
throw new \InvalidArgumentException("Could not figure out parameters!");
}
}