PHP代码超过3个州

时间:2013-06-22 11:30:11

标签: php if-statement

如果您有三种状态,则可以使用if ifif和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 个答案:

答案 0 :(得分:5)

你听说过switch statement吗? :)

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'

答案 1 :(得分:4)

请勿使用switch语句。

显然你有一个更复杂的结构。它不是二进制“true / false”,它不是三元组“true / false / null或unset”。

使用地图,查找数组和/或多态。请防止使用越来越多的无法在某些时候维护的交换机案例。

实施例

查找数组

$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。请记住,这样的数组可以来自数据库,因此可以动态更改,而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),以及如何以较低的复杂性实现相同目标,对于一个优秀的编码人员来说是必不可少的。

答案 2 :(得分:3)

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

switch($user)
{
   case "1": /*your code */ break;
   case "2": .... break;
   case "3": .... break;
   default: ....
}

答案 3 :(得分: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;
}