PHP中的订单状态逻辑

时间:2014-03-07 05:48:02

标签: php

在显示正确的订单状态时遇到一些问题。我想要实现的是让用户知道他们的订单是否:

没有订单, 有兴趣订购, 退还, 调度, 已收到付款, 免费, 已下订单。

到目前为止,我有:

if($no_order){
    $status = "No Order";
}
else{
    if($interested){
        $status = "Interested";
    }
    if($refunded){
        $status = "Refunded";
    }
    etc..
}

我的问题是当我开始在else语句中添加更多内容时,我开始遇到问题。我尝试了其他但没有太多运气。是否有其他解决方案来检查订单状态?而不是使用if / else语句?非常感谢!

2 个答案:

答案 0 :(得分:2)

将测试条件放在数组中是最干净的方法 这段代码适合我。在这里,我定义了一个数组$ordered_statuses,它可以包含要检查的变量的名称和一个能够执行检查并提供相应文本的对象(如果检查成功),按优先顺序排列你在上面描述。然后我迭代它并将$status设置为correect值。

基本上我们在这里做的是使用多态来允许对象(特别是checkValue)的行为在保持一致接口的同时发生变化。实际上,使用PHP interface作为基类是适用的 - 但这对读者来说是一种练习。

“变量变量名称”有点乱 - 可能有更好的方法来执行此操作,具体取决于有用的代码,但我认为这可以满足您的需求。

<?php
class statusCheck {
    function __construct($text){
        $this->text = $text;
    }
    // this can be overridden to 
    // provide different tests.
    function checkValue( $value ){
        return $value ? $this->text : false;   
    }
}
// here's an example of overriding for a more complicated check
class interestCheck extends statusCheck{
    function checkValue($value){
        // maybe interest has to be high enough?
        if( $value > 5 ) 
            return $this->text;
        else
            return false;
    }
}

$ordered_statuses = Array(
    "no_order" => new statusCheck("No Order"),
    "interested" => new interestCheck("Interested"),
    "refunded" =>  new statusCheck("Refunded" )
);
$interested = 7;
//$refunded = true; // should take precedence
$status = 'None';
foreach( $ordered_statuses as $status_name=>$test){
    $text = $test->checkValue( $$status_name); 
    if( $text != false ) 
        $status = $text;
}
echo "$status\n";

答案 1 :(得分:-1)

你可以把它们放在像这样的数组中

$ORDER_STATUS = array(
                    0 => "No Order",
                    1 => "Interested",
                    2 => "Refunded",
                    3 => "Payment Received",
                    4 => "Free of Charge",
                    5 => "Order Placed"

                 );

现在每个状态都是你的数组的索引。

示例1

如果$status=2您可以直接跟踪它$ORDER_STATUS[$status] Refunded

示例2

如果$status=5您可以直接跟踪它$ORDER_STATUS[$status] Order Placed