Я делаю функцию, чтобы вернуть ли или нет данный 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
случаи, которые являются одинаковыми, вы можете объединить их, опуская 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;
}
Надеюсь это поможет! 🙂
Тернарный оператор — все в одной строке:
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=>''];
Этот подход очень прост в поддержке по мере роста / изменения ваших требований.
Наконец, вам не нужно писать break
после return
поскольку return
останавливает все действия внутри функции.