php函数的必需参数混淆

时间:2012-05-30 10:05:48

标签: php function arguments

我正在寻找PHP函数签名

Required Parameter的确切类型

仅使用NULL初始化参数会使其成为可选参数吗?即

function foo($optional=NULL, $OptionalOrRequired="Optional Or Required", $required){}

我对第二个参数感到困惑,是否有必需或可选参数?

更新

我正在使用reflection获取函数的所有必需参数

public function getPlayer($params=3, $c){}
// results
$reflection->getNumberOfParameters()            ->   2
$reflection->getNumberOfRequiredParameters()    ->   2 // it should be one

public function getPlayer($params=3, $c, $x=NULL)
// results
$reflection->getNumberOfParameters()            ->   3
$reflection->getNumberOfRequiredParameters()    ->   2

当我在一个答案中得到默认值在需要之前出现时,这是反射函数返回错误计数所需参数的原因吗?

由于

3 个答案:

答案 0 :(得分:2)

'可选'参数只是具有默认值的参数,无论该值是nullfalse,字符串(等)无关紧要 - 如果函数参数具有默认值,是可选的。

但是,在必需参数之前放置一个可选参数是没有意义的,因为你必须给先前的参数赋予一些值(即使它是null)以便'到达'所需的参数参数 - 所以在最后一个'required'参数之前的所有参数都是有效的。

一些例子:

// Bad
function bad($optional = 'literally anything', $required) {}

bad('required arg');              // This breaks - 'missing argument 2'
bad('something', 'required arg'); // This works - both parameters are needed

// Good
function($required, $optional = 'literally anything') {}

good('required arg');              // This works just fine, last argument has a default
good('required arg', 'something'); // Also works fine, overrides 'literally anything'

更新RE:反思

如上所述,在所需参数之前放置一个'optional'参数有效地使得'optional'参数成为必需,因为必须为它提供一个值才能满足方法签名。

例如,如果第一个参数有默认值而第二个参数没有(比如上面的bad函数),我们需要传递第二个参数,所以我们也需要传递第一个参数,所以两者都是“必需的”。如果后续参数具有默认值,则仍然只需要前两个参数。

答案 1 :(得分:1)

在PHP中的可选参数之后,您无法获得所需的参数。可选参数必须始终遵循所需的参数(如果有的话)。任何提供默认值的参数(例如$param = 'default')都是可选的,任何没有默认值的参数都是必需的。

答案 2 :(得分:-1)

继续我的评论。

function test($required, $optional = null)
{

}

test(); // throws an error stating $required is missing
test('a'); // sets $required to 'a' and $optional is null
test('a', 'b'); // sets $required to 'a' and $optional to 'b'