如何从 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
个相同的案例,您可以通过省略前面案例的 return
和 break
行来合并它们。
下面的3
、4
、5
、6
都取case7
的return
值(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
会停止函数内的所有操作。
我正在为 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
个相同的案例,您可以通过省略前面案例的 return
和 break
行来合并它们。
下面的3
、4
、5
、6
都取case7
的return
值(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
会停止函数内的所有操作。