如何在php中创建可选参数?


189

在PHP手册中,为了显示带有可选参数的函数的语法,它们在每组相关的可选参数周围使用方括号。例如,对于该date()功能,手册内容如下:

string date ( string $format [, int $timestamp = time() ] )

哪里$timestamp是可选参数,当留空时,它默认为time()函数的返回值。

在PHP中定义自定义函数时,如何创建这样的可选参数?

Answers:


253

与手册非常相似=,在参数定义中使用等号():

function dosomething($var1, $var2, $var3 = 'somevalue'){
    // Rest of function here...
}

function dosomething($var1, $var2, $optionalValue = null)我找到了这个更好的选择。
Mohammad Zaid Pathan

52

参数的默认值必须是一个常量表达式。不能是变量或函数调用。

但是,如果需要此功能:

function foo($foo, $bar = false)
{
    if(!$bar)
    {
        $bar = $foo;
    }
}

当然,假设$bar不会是布尔值。


1
但是,它将评估是否将$ 0或“ false”传递给$ bar。
Tyzoid

33
空值是更好的默认值。
2013年

3
@DooMMasteR,$bar === false这是您的意思-这是$bar默认情况下应执行的操作false。如果0传入,这将避免不正确的操作,因此它可以正常工作-除非需要布尔值。正如Kzqai所说,更通用的解决方案是使用$bar = null,因为当$ bar的值为布尔值时,也可以使用。然后测试变为 if (is_null($bar))if ($bar === null)
制造商

22

我也发现有用的一些注意事项:

  • 将默认值保留在右侧。

    function whatever($var1, $var2, $var3="constant", $var4="another")
  • 参数的默认值必须是一个常量表达式。不能是变量或函数调用。


14

给可选参数一个默认值。

function date ($format, $timestamp='') {
}

10

日期函数将定义如下:

function date($format, $timestamp = null)
{
    if ($timestamp === null) {
        $timestamp = time();
    }

    // Format the timestamp according to $format
}

通常,您将使用以下默认值:

function foo($required, $optional = 42)
{
    // This function can be passed one or more arguments
}

但是,只有文字是有效的默认参数,这就是为什么我null在第一个示例中将它用作默认参数,而不是 $timestamp = time(),并将其与null检查结合的原因。文字包括数组(array()[]),布尔值,数字,字符串和null


8

如果您不知道需要处理多少个属性,可以使用...PHP 5.6中引入的可变参数列表token()(请参阅此处的完整文档)。

句法:

function <functionName> ([<type> ]...<$paramName>) {}

例如:

function someVariadricFunc(...$arguments) {
  foreach ($arguments as $arg) {
    // do some stuff with $arg...
  }
}

someVariadricFunc();           // an empty array going to be passed
someVariadricFunc('apple');    // provides a one-element array
someVariadricFunc('apple', 'pear', 'orange', 'banana');

如您所见,该令牌基本上将所有参数都转换为数组,您可以按照自己喜欢的任何方式对其进行处理。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.