在PHP中指定可选参数值的任何方法?

zac*_*zap 21 php function optional-parameters

假设我有一个PHP函数foo:

function foo($firstName = 'john', $lastName = 'doe') {
    echo $firstName . " " . $lastName;
}
// foo(); --> john doe
Run Code Online (Sandbox Code Playgroud)

有没有办法只指定第二个可选参数?

例:

foo($lastName='smith'); // output: john smith
Run Code Online (Sandbox Code Playgroud)

Noa*_*ich 32

PHP不支持函数本身的命名参数.但是,有一些方法可以解决这个问题:

  1. 使用数组作为函数的唯一参数.然后,您可以从数组中提取值.这允许在数组中使用命名参数.
  2. 如果要根据上下文允许可选数量的参数,则可以使用func_num_args和func_get_args,而不是在函数定义中指定有效参数.然后根据参数的数量,字符串长度等,您可以确定要执行的操作.
  3. 将null值传递给您不想指定的任何参数.没有真正解决它,但它的工作原理.
  4. 如果您正在使用对象上下文,则可以使用magic方法__call()来处理这些类型的请求,以便您可以根据传递的参数路由到私有方法.


cee*_*yoz 22

阵列技术的一种变体,可以更容易地设置默认值:

function foo($arguments) {
  $defaults = array(
    'firstName' => 'john',
    'lastName' => 'doe',
  );

  $arguments = array_merge($defaults, $arguments);

  echo $arguments['firstName'] . ' ' . $arguments['lastName'];
}
Run Code Online (Sandbox Code Playgroud)

用法:

foo(array('lastName' => 'smith')); // output: john smith
Run Code Online (Sandbox Code Playgroud)

  • 对于关联数组,`$arguments += $defaults;` 更简洁。 (2认同)

And*_*son 9

你可以稍微重构你的代码:

function foo($firstName = NULL, $lastName = NULL)
{
    if (is_null($firstName))
    {
        $firstName = 'john';
    }
    if (is_null($lastName ))
    {
        $lastName = 'doe';
    }

    echo $firstName . " " . $lastName;
}

foo(); // john doe
foo('bill'); // bill doe
foo(NULL,'smith'); // john smith
foo('bill','smith'); // bill smith
Run Code Online (Sandbox Code Playgroud)


Bil*_*win 6

如果您有多个可选参数,则一种解决方案是传递一个哈希数组参数:

function foo(array $params = array()) {
    echo $params['firstName'] . " " . $params['lastName'];
}

foo(array('lastName'=>'smith'));
Run Code Online (Sandbox Code Playgroud)

当然,在此解决方案中,无法验证散列数组的字段是否存在或拼写正确.完全由您来验证.