PHP:检查整数是否在某个间隔内

时间:2013-04-01 10:24:56

标签: php symfony attributes doctrine

我目前正致力于一个小型在线游戏的成就系统。成就实体基本上有4个属性:

  • ID
  • earnedBy
  • earnedOn
  • 进步

最后一个应该是百分比,意思是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中还有另一个内置函数正在做那件事,如果我正在做的事情是好的(关于良好的开发风格)

4 个答案:

答案 0 :(得分:4)

自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

答案 1 :(得分:3)

您应该考虑从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);

答案 2 :(得分:1)

您可以使用Range约束:

use Symfony\Component\Validator\Constraints\Range;

class Achievement
{
    /**
     * @Range(min=0, max=100)
     */
    private $progress;
}
Symfony中的

Validation由一个单独的图层处理,因此您应该在setter中执行此操作。

答案 3 :(得分:0)

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