【问题标题】:How to get the default value of an optional parameter如何获取可选参数的默认值
【发布时间】:2012-11-03 10:25:54
【问题描述】:

这可能是 PHP 的一个限制,但是否有可能以某种方式调用一个函数 - 并强制执行可选参数的“默认”值 - 即使在函数调用中,给出了可选参数(并且 == null)?

也许更容易表达我的意思:

<?php
    function funcWithOptParam($param1, $param2 = 'optional') {
        print_r('param2: ' . $param2);
    }

    funcWithOptParam('something'); // this is the behaviour I want to reproduce

    // this will result in 'param2: optional'

    funcWithOptParam('something', null); // i want $param2 to be 'optional', not null

    // this will result in 'param2: ' instead of 'param2: optional'
?>

现在,最简单的答案是“不要写 null 然后” - 但在我的特殊情况下,我得到一个参数 array 用于 function 调用,并且只能这样做:

<?php
    funcWithOptParam($param[0], $param[1]);
?>

所以即使$param[1]nullnull 也会覆盖可选参数的默认值

我只看到一个解决方案 - 跳过可选参数,并这样做:

<?php
    function funcWithOptParam($something, $notOptional) {
         if($notOptional === null) {
              $notOptional = 'defaultvalue';
         }

         ...
    }
?>

但我想知道是否有其他解决方案。 PHP 中有一个“真实的”null 值吗?这真的转化为“无”吗?像 undefined 在 js 中的东西?

【问题讨论】:

  • 一个 Hacky 解决方案是通过preg_match 源代码找到默认值。怀疑它是否适用于数组。

标签: php function optional-parameters


【解决方案1】:

为什么不将整个数组作为函数参数传递呢? 您只需这样称呼它:

funcWithOptParams($params);

然后像这样处理它:

function funcWithOptParams($params) {
     if(!isset($params[1])) {
          $params[1] = 'defaultvalue';
     }

     ...
}

这种方法使您可以只传递您想要指定的参数,并在您不想指定的参数中使用默认值。作为奖励,您不必担心参数的顺序。

【讨论】:

  • 很好的答案,我一直在寻找一种更优雅的方式来调用具有大量(部分可选)参数的函数。这样,我不必费心以函数中定义的正确顺序调用具有相同默认值的函数。谢谢你的想法!
【解决方案2】:

您可以使用func_num_args & func_get_args 来创建您想要的行为

function funcWithArbitraryNumParams(){
  $args = array();
  if(!empty(func_num_args)){
   $args = func_get_args();
  }

  print_r($args);
}

【讨论】:

    【解决方案3】:

    可以获取默认值,但是比较丑……

    $function = new ReflectionFunction('your_function_name');
    
    foreach ($function->getParameters() as $param) {
        echo 'Name: ' . $param->getName() . PHP_EOL;
        if ($param->isOptional()) {
            echo 'Default value: ' . $param->getDefaultValue() . PHP_EOL;
        }
        echo PHP_EOL;
    }
    

    CodePad.

    您可以检查参数是否为NULL,如果是,则将其替换为默认值。

    【讨论】:

      猜你喜欢
      • 2013-04-17
      • 2015-02-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      相关资源
      最近更新 更多