【问题标题】:Can I use a function to return a default param in php?我可以使用函数在 php 中返回默认参数吗?
【发布时间】:2011-10-26 09:57:29
【问题描述】:

我想做这样的事情:

function readUser($aUser = loadDefaultUser()){

 //doing read User
}

我发现它会向我显示错误,如何将函数返回作为默认值传递?谢谢你。

【问题讨论】:

    标签: php default


    【解决方案1】:
    function readUser($aUser = NULL){
       if ($aUser === NULL){
            $aUser = loadDefaultUser();
       }
    
       //do your stuff
    }
    

    【讨论】:

    • 这里的问题是您正在测试 false,在许多情况下这不是正确的默认值。使用 NULL 查看我的答案。
    • 除了他的代码语法错误之外,最好使用 null,因为 false 可能是不应触发默认情况的有效输入。最好是某种 php 内部函数,它返回参数是否默认传递或初始化。
    • @Nobody 这可以通过使用func_num_args() 来完成,但我怀疑这种风格是否会使代码更易于维护,而不是琐碎的参数列表。
    • @Shi:我的意思是我会调用was_passed_by_user,如果给定变量是用户传递的参数,它将返回true,默认情况下初始化为false,默认情况下为NULL包含函数没有此名称的参数。
    【解决方案2】:

    我宁愿给这个参数一个Null 值,然后在函数体中调用loadDefaultUser()。像这样的:

    function readUser($aUser = NULL){
        if(is_null($aUser)){
            $aUser = loadDefaultUser();
        }
        //...
    }
    

    【讨论】:

    • 解析错误:语法错误,意外的 T_STRING,在第 3 行的 /data/sandbox/g/7f2d9.php 中需要 '('
    【解决方案3】:

    您可以在 loadDefaultUser() 函数中添加一个回调参数,当它完成时它会触发带有返回/结果的回调函数。这有点像 ajax-javascript 回调。

    function loadDefaultUser ( $callback ) 
    {
       $result = true;       
       return $callback($result);
    }
    

    【讨论】:

      【解决方案4】:

      是的,you can provide a default argument。但是,默认参数“必须是常量表达式,而不是(例如)变量、类成员或函数调用。”

      您可以通过使用一些常量值作为默认值来伪造此行为,然后在调用函数时将其替换为函数调用的结果。

      我们将使用NULL,因为这是一个非常典型的“无价值”值:

      function readUser($aUser = NULL) {
          if (is_null($aUser))
              $aUser = loadDefaultUser();
      
          // ... your code here
      }
      

      【讨论】:

      • 最好使用if ($aUser === NULL),因为这样更快并且可以节省 PHP 调用(内置)函数is_null()。这并不重要,但可以“免费”让您的 PHP 应用程序更快。
      • @Shi: (a) 实际上并没有更快; (b) 避免像这样的微优化; (c) 嗯,这可能有利于代码对称,因为我将它设置为上面的NULL
      • 为什么?为什么要避免使用=== NULL 而不是is_null()?正如我所说,这并不重要,你仍然可以免费获得“提升”。那么为什么不使用它呢?能解释一下或者给个链接吗?好的,关于您的代码对称性,所以要么在 is_string()is_int()is_null()$a = NULL; if ($a === NULL) … 中对称。不过,为什么(b)?
      • @Shi:因为is_null具有更高的抽象性,因此更好。虽然在这里不太可能,但根据习惯,如果您使用这样的抽象函数,那么当所需的行为发生变化时,您将来会受到保护。
      • 为什么要避免微优化?哈哈。我什至不知道从哪里开始开始。 (这并不是说“避免与微优化相同的代码”。它的意思是“避免微优化的行为。”)
      猜你喜欢
      • 2015-05-19
      • 1970-01-01
      • 2011-04-01
      • 2018-01-21
      • 2012-07-25
      • 1970-01-01
      • 2011-04-18
      • 2014-04-28
      相关资源
      最近更新 更多