Как исключить повторяющиеся случаи из оператора switch в переполнении стека

Я делаю функцию, чтобы вернуть ли или нет данный 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и я ищу что-то меньшее, чтобы использовать.

-3

Решение

Если у вас есть switch случаи, которые являются одинаковыми, вы можете объединить их, опуская return а также break линии предыдущих случаев.

В следующих, 3, 4, 5 а также 6 все принимают return значение дела 7 (true):

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

Хотя сказав это, учитывая все кажется, возвращается так же, кроме вашего по умолчанию, вы могли бы лучше использовать простой if состояние. Вы даже можете указать, что роли должны быть между 3 и 7:

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

Надеюсь это поможет! 🙂

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;
}
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);
}
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 останавливает все действия внутри функции.

0
По вопросам рекламы [email protected]