【问题标题】:PHP function with variable as default value for a parameter将变量作为参数的默认值的 PHP 函数
【发布时间】:2011-05-02 16:01:56
【问题描述】:

默认情况下,PHP 函数使用$_GET 变量。有时应该在未设置$_GET 的情况下调用此函数。在这种情况下,我会将所需的变量定义为参数,例如:actionOne(234)

为了获得抽象代码,我尝试了这样的方法:

function actionOne($id=$_GET["ID"])

导致错误:

解析错误:语法错误,意外的 T_VARIABLE

难道不能用变量来定义默认参数吗?

编辑

actionOne 使用框架 Yii 从 URL “直接”调用。通过在这个函数之外处理$_GET 变量,我不得不在一个中心组件上执行此操作(即使它是一个简单、无关紧要的函数),或者我必须更改框架,这是我不喜欢做的。

另一种方法是使用虚拟函数(类似于前置函数),由 URL 调用。这个“虚拟”函数处理变量问题并调用actionOne($id)。

【问题讨论】:

    标签: php function variables parameters


    【解决方案1】:

    不,这是不可能的,正如Function arguments manual page 所述:

    默认值必须是常量 表达式,而不是(例如)a 变量、类成员或函数 打电话。

    相反,您可以简单地将 null 作为默认值传递并在您的函数中更新它...

    function actionOne($id=null) {
        $id = isset($id) ? $id : $_GET['ID'];
        ....
    }
    

    ...或者(更好),当您没有要传入的特定 ID 时,只需提供 $_GET['ID'] 作为参数值。(即:在函数外部处理它。)

    【讨论】:

    • 这里也一样,解决方案破坏了封装,检查应该发生在函数之外。
    • 我更新了我的帖子。在我的具体情况下,您的解决方案看起来是最好的方法......(我很快就会检查出来)一般来说,我可能会使用@Galen 的解决方案形式。 “只需提供 $_GET['ID'] 作为参数值”是什么意思?这是根据你的例子吗?
    • 使用 "$id===null?$id=$_GET["ID"]:null;" 不是更好吗?而不是 $id = isset($id) ? $id : $_GET['ID'];?因为你避免了一次 $id 的赋值,如果 $id 仍然设置 ($id=$id)!?! ..或者没有什么不同?
    • @The Bndr 我的意思是你会在调用函数之前分配 $id ,而不是在函数本身中。关于你的第二点——如果你担心变量赋值的开销,我怀疑你不应该使用 PHP。 :-)
    • @middaparka 也许吧! ;-) 但我分配 $id 的版本也可用?!还是您的版本是“更好的做法”?
    【解决方案2】:
    function actionOne( $id=null ) {
        if ($id === null) $id = $_GET['ID'];
    }
    

    但是,我可能会在函数之外执行此操作:

    // This line would change, its just a for instance
    $id = $id ? $id : $_GET['id'];
    actionOne( $id );
    

    【讨论】:

    • 嗨,谢谢....没有别的办法吗? ...没有在这个函数内部或外部处理这个问题?
    • 我仍然认为您应该提供好的做法作为主要示例,而将较差的做法作为替代方法!
    【解决方案3】:

    您应该在调用函数之前获取该 ID。检查参数是否存在会破坏封装。你应该这样做:

    if (isset($_GET["ID"])
    {
        $id = $_GET["ID"];
    }
    else
    {
        //$id = something else
    }
    
    function doSomethingWithID($id)
    {
        //do something
    }
    

    【讨论】:

      【解决方案4】:

      是的,这是不可能的。

      默认必须是静态变量:

      function actionOne( $id='something') {
          //code
      }
      

      【讨论】:

      • 一个静态变量?你正在传递一个字符串?这如何解决问题?
      • 在 PHP afaik 中唯一被称为动态变量的是变量变量,它也不能解决问题。
      • 您的解决方案是错误的,您将字符串作为默认值传递,这如何解决原始问题?
      【解决方案5】:

      简单的花生!
      (可能包含小错误、错误或拼写错误!)

      你需要一个辅助函数,它会递归调用你的 main 函数,但默认为 NULL:

      错误:function actionOne($id=$_GET["ID"])

      右:

      function actionOne($id) {...}
      function actionOnewithID($id=NULL) {
        if (NULL==$id){actionOne($_GET["ID"]);}
        else {actionOne($id);
      }
      

      如果你需要返回一个值:

      function actionOne($id) {...}
      function actionOnewithID($id=NULL) {
        if (NULL==$id){return(actionOne($_GET["ID"]));}
        else {return(actionOne($id));
      }
      

      我希望这会有所帮助!

      【讨论】:

        【解决方案6】:

        你可以使用常量变量

        define('ID',$_GET["ID"]);
        function($id = _ID_){
            //code
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-01-27
          • 2012-02-03
          • 1970-01-01
          • 1970-01-01
          • 2016-07-17
          • 2019-09-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多