【问题标题】:PHP: Check whether an integer is in a certain interval or notPHP:检查整数是否在某个区间内
【发布时间】:2013-04-01 10:24:55
【问题描述】:

我目前正在为一款小型在线游戏开发成就系统。成就实体基本有4个属性:

  • 身份证
  • 获得者
  • 赚了
  • 进展

最后一个应该是百分比,意思是0到100之间的数字。为了确保数据库中不会保存大于100或小于0的数字,我的setter方法如下(我正在使用 Symfony2 / Doctrine ORM):

public function setProgress($progress)
    {
        $this->progress = max(min($progress, 100), 0);

        return $this;
    }

这里重要的一行是max(min($progress, 100), 0)

它工作得很好,我只是想问一下,PHP 中是否有另一个内置函数可以做这件事,以及我所做的是否可以(关于良好的开发风格)

【问题讨论】:

  • 我不认为有任何这样的内置功能可以满足您的需要,而且您目前正在做的事情非常好..
  • 看起来不错。我可能会将它分成两行而不是嵌套它以使 max() min() 函数调用更具可读性。
  • @tereško,上下文很重要。鉴于他使用的是 Symfony2 框架,可能有更适合他的问题的解决方案。
  • @Gerry,不,它没有。

标签: php symfony attributes doctrine


【解决方案1】:

从 PHP 5.2 开始,有 filter_var() 函数和相当多的 options 可用。

其中一个可以让您检查数字是否在一个范围内:

$param = 10;

$result = filter_var( $param, FILTER_VALIDATE_INT, [
    'options' => [
        'min_range' => 20, 
        'max_range' => 40
    ]
]);

var_dump( $result ); // will return FALSE for 10

http://codepad.viper-7.com/kVwx7L

【讨论】:

    【解决方案2】:

    您应该考虑从 Symfony2 的 the validation component 对您的实体添加一些约束。

    use Symfony\Component\Validator\Constraints as Assert;
    
    class Achievement
    {
       /**
        * @Assert\Range(min=0, max=100)
        */
        protected progress;
    }
    

    验证器服务在验证表单时会自动调用,但您甚至可以通过获取验证器服务手动调用它,例如在您的控制器中。

    $achievement = new Achievement();
    $errors = $this->get('validator')->validate($achievement);
    

    【讨论】:

    • 你真的不应该将 Symfony 的 DI 容器用作简单的服务定位器。你可能会觉得this lecture 很有趣。
    【解决方案3】:

    您可以使用Range 约束:

    use Symfony\Component\Validator\Constraints\Range;
    
    class Achievement
    {
        /**
         * @Range(min=0, max=100)
         */
        private $progress;
    }
    

    Validation 在 Symfony 中由单独的层处理,所以你不应该在 setter 中这样做。

    【讨论】:

      【解决方案4】:

      简短的回答是,PHP 中没有内置函数可以“截断”上下边界的数字。 写min(max(x, max_value), min_value) 真的没问题——它简短易读。

      【讨论】:

        猜你喜欢
        • 2012-05-27
        • 1970-01-01
        • 2022-01-18
        • 2017-05-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-25
        • 2013-04-02
        相关资源
        最近更新 更多