PHP:检查一个整数是否在一定的间隔内


PHP: Check whether an integer is in a certain interval or not

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

  • id
  • <
  • 减去准予/gh>
  • 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做的事情,如果我所做的是好的(关于良好的开发风格)

从PHP 5.2开始,filter_var()函数具有相当多的可用选项集。

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

$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

您应该考虑从Symfony2的验证组件中为实体添加一些约束。

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);

您可以使用Range约束:

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

Symfony中的验证是由一个单独的层处理的,所以你应该而不是在setter中执行。

简短的回答是没有, PHP中没有内置函数在下限和上限处"截断"数字。它真的可以写min(max(x, max_value), min_value) -它很短,可读。