2

我正在寻找Required ParameterPHP 函数签名中的 a的确切类型

仅使用 NULL 初始化参数是否使其成为可选参数?IE

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

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

谢谢

4

3 回答 3

3

“可选”参数只是具有默认值的参数,该值是否是null, false,字符串(等)无关紧要 - 如果函数参数具有默认值,则它是可选的。

但是,将可选参数放在必需参数之前是没有意义的,因为您必须给前面的参数一些值(即使它是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:反射

如上所述,在必需参数之前放置一个“可选”参数有效地使该“可选”参数成为必需参数,因为必须为其提供一个值才能满足方法签名。

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

于 2012-05-30T10:18:52.220 回答
1

PHP 中的可选参数后面不能有必需参数。可选参数必须始终遵循必需的参数(如果有)。任何提供了默认值的参数(例如$param = 'default')都是可选的,任何没有默认值的参数都是必需的。

于 2012-05-30T10:08:30.930 回答
-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'
于 2012-05-30T10:08:37.793 回答