如何消除PHP

时间:2017-12-13 02:17:12

标签: php switch-statement micro-optimization

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

4 个答案:

答案 0 :(得分:0)

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

在下文中,3456都采用案例return的{​​{1}}值{{1 }}):

7

尽管如此,考虑到一切似乎与默认值相同,但最好还是使用简单的true条件。您甚至可以指定角色应该在3到7之间:

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

希望这有帮助! :)

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以像这样使用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 :(得分:0)

查找数组可用于消除条件语句。 由于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=>''];当您的需求增长/变化时,此方法非常易于维护。

最后,您不需要在break后写return,因为return会暂停该功能内的所有操作。