ZendFramework:如何使这个PHP代码不那么脆弱?

时间:2017-06-12 18:28:16

标签: php design-patterns zend-framework2

Zend Framework 2的实习新手,一直试图让这段代码更具适应性:

class UserCohort {
    private $toString;

    function __construct($count)
    {
        $this->count = $count;
        if ($count < 5000) {
            $this->toString = "less_than_5k";
        } else  if ($count < 25000) {
            $this->toString = "5k_to_25k";
        } else if  ($count < 100000) {
            $this->toString = "25k_to_100k";
        } else {
            $this->toString = "greater_than_100k";
        }
    }

    public function __toString()
    {
        return $this->toString;
    }
}

尝试使用范围支持获得类似枚举的功能,例如UserCohort(4998)== UserCohort(4999)等,具体取决于您的编程方式。我知道如何用Java做到这一点,但是有比上面我的php解决方案更好的方法吗?

没有真正发现SPLENUM类有用,不能想到任何其他设计模式,以使这些代码不那么脆弱,想到工厂,但这对于这样简单的功能似乎很多工作。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以为字符串使用一些常量并使用开关而不是if else子句:

class UserCohort {
    const LESS_THEN_5K = "less_than_5k";
    const RANGE_5K_TO_25K = "5k_to_25k";
    const RANGE_25K_TO_100K = "25k_to_100k";
    const GREATER_THEN_100K = "greater_than_100k";

    private $string;

    private $count;

    function __construct($count)
    {
        $this->count = $count;
        switch(true){
            case $count < 5000:
                $this->string = self::LESS_THEN_5K;
                break;
            case $count < 25000:
                $this->string = self::RANGE_5K_TO_25K;
                break;
            case $count < 100000:
                $this->string = self::RANGE_25K_TO_100K;
                break;
            default:
                $this->string = self::GREATER_THEN_100K;
        }
    }

    public function __toString()
    {
        return $this->string;
    }
}

但我想这更多是关于美学然后是一个合适的选择。 也许您还应该考虑检查您收到的变量类型$count作为输入,如果它不是数字则抛出异常。

答案 1 :(得分:0)

如果您比较像UserCohort(4998) == UserCohort(4999)这样的对象实例,它将不会像您期望的那样。因为这意味着您要比较object而不是字符串结果。 如果要比较对象产生的字符串,则需要先将object转换为字符串。或者你可以这样做

strval(UserCohort(4998)) == strval(UserCohort(4999));