如何从 PHP 中的 switch 语句中消除重复案例

How eliminate duplicate cases from a switch statement in PHP

我正在为 return 创建一个函数,无论给定的 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 太多了,我正在寻找更小的东西来使用。

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

下面的3456都取case7return值(true):

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

尽管如此,考虑到 一切 似乎 return 除了您的默认设置之外,您最好还是使用一个简单的 if 条件。您甚至可以指定角色应介于 3 和 7 之间:

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

希望对您有所帮助! :)

三元运算符 - 全部在一行中:

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;
}

您可以这样使用 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);
}

查找数组可用于消除条件语句。 因为 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=>'']; 这种方法很容易维护,因为您的要求 grow/change。

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