【问题标题】:How eliminate duplicate cases from a switch statement in PHP如何从 PHP 中的 switch 语句中消除重复的情况
【发布时间】:2018-05-26 20:11:30
【问题描述】:

我正在创建一个函数来返回给定的user_id 是否是该站点的工作人员。这就是我所拥有的并且它有效,但是我觉得它可以大大改进。

public function isUserStaff($uid) {
    $stmt = $this->conn->prepare("SELECT user_role FROM users WHERE user_id=:user_id");
    $stmt->execute(array(':user_id'=>$uid));
    $userRow = $stmt->fetch(PDO::FETCH_ASSOC);

    $role = $userRow['user_role'];

    switch($role) {
        case 3:
            return true;
            break;
        case 4:
            return true;
            break;
        case 5:
            return true;
            break;
        case 6:
            return true;
            break;
        case 7:
            return true;
            break;
        default:
            return false;
            break;
    }
}

我希望有人可以帮助我并描述如何使我的代码变得更好。我认为case 的数量太多,我正在寻找更小的东西来使用。

【问题讨论】:

  • 完成@AlexanderO'Mara

标签: php switch-statement micro-optimization


【解决方案1】:

查找数组可用于消除条件语句。 因为in_array()isset() 慢得多,所以建议您将查找设置为将值存储为键。

代码:

public function isUserStaff($uid) {
    $stmt = $this->conn->prepare("SELECT user_role FROM users WHERE user_id=:user_id");
    $stmt->execute(array(':user_id'=>$uid));
    $userRow = $stmt->fetch(PDO::FETCH_ASSOC);

    $lookup=[3=>'',4=>'',5=>'',6=>'',7=>'']; // or array_flip(range(3,7))
    return isset($lookup[$userRow['user_role']]);
}

当您的标识值不连续时,此解决方案变得更加有用——您只需将它们列在一个数组中:$lookup=[3=>'',6=>'',9=>'']; 随着您的需求增长/变化,这种方法很容易维护。

最后,您不需要在return 之后写break,因为return 会暂停函数内的所有操作。

【讨论】:

    【解决方案2】:

    你可以像这样使用in_array

    public function isUserStaff($uid) {
        $stmt = $this->conn->prepare("SELECT user_role FROM users WHERE user_id=:user_id");
        $stmt->execute(array(':user_id'=>$uid));
        $userRow = $stmt->fetch(PDO::FETCH_ASSOC);
    
        $role = $userRow['user_role'];
    
        return in_array($role, [
            3,
            4,
            5,
            6,
            7
        ], true);
    }
    

    【讨论】:

      【解决方案3】:

      三元运算符 - 都在一行中:

      public function isUserStaff($uid){
          $stmt=$this->conn->prepare("SELECT user_role FROM users WHERE user_id=:user_id");
          $stmt->execute(array(':user_id'=>$uid));
          $userRow=$stmt->fetch(PDO::FETCH_ASSOC);
      
          return $userRow['user_role']<3 && $userRow['user_role']>7 ? false : true;
      }
      

      【讨论】:

      • 看起来很干净,但会抛出 PHP Parse error: syntax error, unexpected 'return'
      • 这不是你应该对生产代码做的事情。这很难快速阅读。
      • 如果你要返回一个布尔值,只需翻转逻辑并返回表达式的结果。 return $userRow['user_role'] &gt;= 3 &amp;&amp; $userRow['user_role'] &lt;= 7;
      • 已编辑。三元运算符是完全有效的,这就是它们存在的原因。易读性是个人的问题。
      【解决方案4】:

      如果您有相同的switch 案例,您可以通过省略早期案例的returnbreak 行来合并它们。

      以下3456都取return大小写7(true)的值:

      switch($role) {
          case 3:
          case 4:
          case 5:
          case 6:
          case 7:
              return true;
              break;
          default:
              return false;
              break;
      }
      

      尽管已经说过,考虑到 everything 似乎除了您的默认值之外都以相同的方式返回,您最好使用简单的if 条件。你甚至可以指定角色应该在 3 到 7 之间:

      if ($role >= 3 && $role <= 7) {
          return true;
      }
      else {
          return false;
      }
      

      希望这会有所帮助! :)

      【讨论】:

      • 我不知道你能做到这一点,它肯定有帮助!谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-09
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多