PHP中可选参数的问题

时间:2010-10-13 21:39:27

标签: php

我有一个带有四个可选参数的函数:

public function doSomething($x = null, $y = null, $a = null, $b = null) {  }

然而,当我尝试调用此函数并仅指定$ y时:

$object->doSomething($y=3)

似乎忽略了我将$ y设置为3,而是将$ x设置为3.有没有理由为什么PHP可能会发生这种情况?我以前从未习惯过这个问题......

谢谢,

2 个答案:

答案 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);