-3

如果您有三个状态,您可以使用 if elseif 和 else 来显示您的动态页面,其中包含三个选项。像下面

if($user == 1){
  // put code here for first state
}elseif($user == 2){
  // put code here for 2nd state
}else{
  // Put code here for default state
}

但我有5个这样的州。如何使用它们使我的页面动态,即$user == 1$user == 2$user == 3$user == 4默认值(我想向除$user == *之外的所有人显示默认值)

4

4 回答 4

5

你听说过switch 语句吗?:)

switch($user) {
    case 1:
        // Do something
        break;
    case 2:
        // Do something
        break;
    case 3:
        // Do something
        break;
    case 4:
        // Do something
        break;
    case 5:
        // Do something
        break;
    default:
        // Do something
        break;
}

请注意,在这种情况下,case关键字后面的数字可能看起来像语法、约定或其他。他们不是。这些实际上是您比较的值$user。所以也可能有一个,如果 的值为字符串case 'this is a string':,它将被执行。$user'this is a string'

于 2013-06-22T11:32:47.387 回答
4

不要使用 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),以及如何以较低的复杂性实现同样的事情,对于一个好的编码人员来说是必不可少的。

于 2013-06-22T11:57:03.273 回答
3

使用switchhttp ://php.net/manual/en/control-structures.switch.php

switch($user)
{
   case "1": /*your code */ break;
   case "2": .... break;
   case "3": .... break;
   default: ....
}
于 2013-06-22T11:32:43.370 回答
2
switch ($user) {
    case 1:
        // put code here for 1st state
        break;
    case 2:
        // put code here for 2nd state
        break;
    case 3:
        // put code here for 3rd state
        break;
    default:
        // put code here for default state
        break;
}
于 2013-06-22T11:33:46.063 回答