【问题标题】:php function's required parameter confusionphp函数所需参数混淆
【发布时间】:2012-06-04 13:29:28
【问题描述】:

我在 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

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

谢谢

【问题讨论】:

  • 基本上,您在函数声明中省略参数的右侧,即= null,则它是必需的,否则如果未提供,则参数采用您在右侧指定的默认值参数声明。
  • 感谢 Gavin 的快速回复,实际上我对这个 NULL 与我在第二个参数中使用的实际值感到困惑。在给定的方法签名中,第二个参数是可选的还是必需的?
  • 可选,因为你已经为它提供了默认值,如果用户在调用它时不提供值。

标签: php function arguments


【解决方案1】:

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

但是,将可选参数放在必需参数之前是没有意义的,因为您必须给前面的参数一些值(即使它是null)才能“获取”所需参数 -所以最后一个“必需”参数之前的所有参数都是有效的。

一些例子:

// 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 个参数。

【讨论】:

    【解决方案2】:

    关于我的评论。

    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'
    

    【讨论】:

    • 这不是 OP 所说的。他对一个函数的可选参数首先出现,然后是必需的参数感到困惑。例如:function test($optional = null, $required)
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      • 2013-03-20
      • 2016-02-14
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多