我正在创建一个函数来返回给定的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
太多了,我正在寻找更小的东西。
答案 0 :(得分:0)
如果switch
个案例相同,您可以通过省略早期案例的return
和break
行来合并它们。
在下文中,3
,4
,5
和6
都采用案例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
会暂停该功能内的所有操作。