不要使用 switch 语句。
显然你有一个更复杂的结构。它不是二进制的“真/假”,也不是三元的“真/假/空或未设置”。
使用映射、查找数组和/或多态性。一定要防止使用在某些时候无法维护的不断增长的 switch case 列表。
例子
查找数组
$usermap = array(
1 => array('data for user 1'),
2 => array('data for user 2'),
);
if (isset($usermap[$userid])) {
// do something with $usermap[$userid]
} else {
// default case
}
好处:所有用户特定的数据都在一个数组中。您只有两个代码案例:已知用户的特殊案例和其他所有人的默认案例。特殊情况和一般情况的代码只需编写一次。
缺点:特例代码对所有特殊用户都是一样的,只是数据不同。
一般来说,很多时候你可以switch
通过应用这样的映射数组来防止使用 a 。请记住,这样的数组可以来自数据库,因此可以动态更改,而 switch 语句中的代码是完全静态的 - 更改它需要编码器。
使用 lambda 函数查找代码
如果您需要一些不同的代码,您也可以将其存储在变量中(自 PHP 5.3 起有效):
$usermap = array(
1 => array('code' => function() { return 1+1; } ),
2 => array('code' => function() { return 2*3; } ),
);
if (isset($usermap[$userid])) {
$stuff = $usermap[$userid]['code'](); // execute the function
} else {
$stuff = 0; // default
}
这样,您可以以某些方式更改执行的代码。不过要小心,如果您在数组中的 lambda 函数中放入太多逻辑,这可能会比简单的 switch 语句更复杂。
更好的解决方案是使用
多态对象
这是一种基本的 OOP 内容:您将用户的一般行为写入对象,特殊情况扩展了这种一般情况并更改了一些内容。
class User {
public function getFoo() {
return 0;
}
}
class SpecialUser1 extends User {
public function getFoo() {
return 1+1;
}
}
class SpecialUser2 extends User {
public function getFoo() {
return 2*3;
}
}
$usermap = array(
1 => array('SpecialUser1'),
2 => array('SpecialUser2'),
);
if (isset($usermap[$userid])) {
$user = new $usermap[$userid]();
} else {
$user = new User;
}
$user->getFoo(); // Different result depending on the user id
所以有很多方法可以防止使用switch
. 为什么?因为switch
在一个集中的地方给代码增加了很多复杂性。这被认为是一件坏事。复杂性是不可避免的,它是创建软件的必要副产品。但真正的挑战是防止复杂性累积和集中。将复杂性分散到某些层几乎总是更好。
因此,知道要避免哪些事情(例如switch
),以及如何以较低的复杂性实现同样的事情,对于一个好的编码人员来说是必不可少的。