我有一个带有四个可选参数的函数:
public function doSomething($x = null, $y = null, $a = null, $b = null) { }
然而,当我尝试调用此函数并仅指定$ y时:
$object->doSomething($y=3)
似乎忽略了我将$ y设置为3,而是将$ x设置为3.有没有理由为什么PHP可能会发生这种情况?我以前从未习惯过这个问题......
谢谢,
丹
答案 0 :(得分:6)
您必须按照在方法签名中声明的顺序传递参数,无论它们是否可选。这意味着您必须在$x
之前指定$y
,无论如何。
如果您不需要传递$x
的任何其他值,则必须传递null。您仍然可以跳过剩余的可选参数:
$object->doSomething(NULL, 3)
此外,PHP不支持命名参数。因此,您无法在调用代码中显式编写$y
,因为在PHP中实际上在调用代码的范围内设置了$y
,而不是doSomething()
的方法体的范围。 / p>
编辑:根据dpk的建议,作为替代路线,您可以更改方法以接受散列(关联数组),并可选择覆盖某些默认值并extract()
其值进入范围:
public function doSomething(array $args = array()) {
$defaults = array('x' => NULL, 'y' => NULL, 'a' => NULL, 'b' => NULL);
extract(array_merge($defaults, $args));
// Use $x et al as normal...
}
在您的主叫代码中:
$object->doSomething(array('y' => 3));
答案 1 :(得分:1)
即使$ x是可选的,位置也不是那么$ y需要是第二个参数。尝试:
$object->doSomething(null,3);