【问题标题】:PHP - assigning values in a function argument - good practice?PHP - 在函数参数中赋值 - 好的做法?
【发布时间】:2011-11-18 13:48:56
【问题描述】:

在函数调用中设置变量值 - 我很少看到这种情况,这被认为是好的做法吗?

function myUpdate($status){
    ...
}

myUpdate($status = 'live');

我个人喜欢它,因为它更具描述性。我更频繁地看到它,即在函数定义中分配一个默认值。

【问题讨论】:

  • 哇,这行得通吗? :O
  • 你知道这样做不会以任何方式影响函数的执行,并且只会在调用范围内分配一个局部变量吗?
  • @Rijk 是的,它可以工作,因为 PHP 中的赋值结果就是赋值。
  • @Rijk:它有效,但请阅读 Jani 的评论以了解它究竟做了什么(提示:它做了一些任何理智的人都不会永远想做的事情 i>)。
  • 我只是在开玩笑——看我的回答 :)

标签: php


【解决方案1】:

别开玩笑了,说真的,你为什么要使用它?您必须意识到这与分配默认值完全不同。您在这里所做的是将值分配给变量,然后将该变量传递给函数。结果是,在函数调用之后,$status 变量仍然被定义。

myUpdate( $status = 'live' );
echo $status; // "live"

即使这是你想要的,我会说它的描述性更少而不是仅仅分成两行。

【讨论】:

    【解决方案2】:

    嗯,默认值是不同的。

    // if you call myUpdate without argument, it will have $status with value live
    function myUpdate($status = 'live'){
    
    }
    

    调用这个:

    myUpdate($status = 'live');
    

    相当于:

    myUpdate('live');
    

    唯一的区别是,在调用之后,如果您像 myUpdate($status = 'live'); 一样调用它,您将把值为 live$status var 保留在您调用函数的范围内,而不是在其中。

    但是恕我直言,这样做更具可读性:

    $status = 'live';
    myUpdate($status);
    

    【讨论】:

      【解决方案3】:

      这是一个非常糟糕的主意,因为它基本上是代码混淆。 php 确实支持关键字参数,这可能会导致奇怪的东西。举个例子:

      function f($a, $b){
          echo 'a: ' . $a . "\n";
          echo 'b: ' . $b . "\n";
      }
      f($b='b-value', $a='a-value');
      

      这个程序不仅输出

      a: b-value
      b: a-value
      

      定义全局上下文中的变量$b$a。这是因为

      f($b='b-value', $a='a-value');
      // is the same thing as ...
      $b = 'b-value';
      $a = 'a-value';
      f($b, $a);
      

      您可以采取一些好的做法来更轻松地记住方法参数:

      • 配置您的编辑器/IDE 以在突出显示时显示函数的签名。
      • 如果一个函数有很多描述某种状态的参数,请考虑将它移到一个 *object*t 中(代替它保存状态)
      • 如果您的函数只需要大量参数,请为所有非必要参数设置一个数组。这也让方法调用者完全不用担心众多选项,她只需要知道她感兴趣的选项即可。

      【讨论】:

      • 这不是代码混淆。如果函数中有 3 个 bool 参数,使用描述性方式添加变量实际上会提高可读性。
      • @Darhazer 它确实提高了可读性,直到有人更改方法的签名。从那时起,这种做法将主动误导程序员关于实际的方法签名。
      【解决方案4】:

      不,这不是因为它是额外的代码。试试:

      myUpdate('live' /*status*/, 42 /*maxTries*/);

      或者如果你真的想要命名参数,你可以使用映射:

      myUpdate(array(
          'status' => 'live'
      ));
      

      通常它会破坏类型安全,但无论如何 PHP 没有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-06
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        • 2011-02-19
        • 2021-03-20
        • 2011-04-07
        相关资源
        最近更新 更多