PHP中可选参数的问题

Dan*_*Dan 2 php

我有一个函数,它有四个可选参数:

public function doSomething($x = null, $y = null, $a = null, $b = null) {  }
Run Code Online (Sandbox Code Playgroud)

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

$object->doSomething($y=3)
Run Code Online (Sandbox Code Playgroud)

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

谢谢,

担

Bol*_*ock 6

您必须按照在方法签名中声明的顺序传递参数,无论它们是否可选.这意味着你必须$x在之前指定$y,无论如何.

如果您不需要传递任何其他值$x,则必须传递null.您仍然可以跳过剩余的可选参数,当然:

$object->doSomething(NULL, 3)
Run Code Online (Sandbox Code Playgroud)

此外,PHP不支持命名参数.因此,您无法$y在调用代码中显式写入,因为在PHP中实际设置$y在调用代码的范围内,而不是在doSomething()方法体的范围内.

编辑:根据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...
}
Run Code Online (Sandbox Code Playgroud)

在您的通话代码中:

$object->doSomething(array('y' => 3));
Run Code Online (Sandbox Code Playgroud)