Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的可选参数存在问题_Php - Fatal编程技术网

PHP中的可选参数存在问题

PHP中的可选参数存在问题,php,Php,我有一个函数,它有四个可选参数: public function doSomething($x = null, $y = null, $a = null, $b = null) { } 但是,当我尝试调用此函数并仅指定$y时,例如: $object->doSomething($y=3) 它似乎忽略了我将$y设置为3,而将$x设置为3。有什么原因可以解释为什么PHP会出现这种情况?我以前从未有过这个问题 谢谢 Dan您必须按照在方法签名中声明的顺序传递参数,无论它们是否可选。这意味着您

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

public function doSomething($x = null, $y = null, $a = null, $b = null) {  }
但是,当我尝试调用此函数并仅指定$y时,例如:

$object->doSomething($y=3)
它似乎忽略了我将$y设置为3,而将$x设置为3。有什么原因可以解释为什么PHP会出现这种情况?我以前从未有过这个问题

谢谢


Dan

您必须按照在方法签名中声明的顺序传递参数,无论它们是否可选。这意味着您必须在
$y
之前指定
$x
,无论发生什么情况

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

$object->doSomething(NULL, 3)
此外,PHP不支持命名参数。因此,您不能在调用代码中显式地编写
$y
,因为在PHP中,它实际上将
$y
设置在调用代码的范围内,而不是
doSomething()
的方法体的范围内

编辑:根据dpk的建议,作为替代方法,您可以更改方法以接受散列(关联数组),并选择性地覆盖一些默认值,并将其值提取到范围中:

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

即使$x是可选的,位置也不是如此$y需要作为第二个参数。尝试:

$object->doSomething(null,3);

正确的。正如OP所期望的那样,实现这一点的方法是传递一个散列作为参数(数组('y'=>3))或一些类似的数据结构(object..),谢谢-出于某种原因,我假设您可以做我正在做的事情。一定是另一种语言潜入了!