8

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

  • ID
  • 赚取的
  • 赚到
  • 进步

最后一个应该是百分比,意思是 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

4 回答 4

4

自 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

于 2013-04-01T23:13:39.667 回答
3

您应该考虑从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);
于 2013-04-01T10:50:21.607 回答
1

您可以使用Range约束:

use Symfony\Component\Validator\Constraints\Range;

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

Symfony 中的验证由一个单独的层处理,因此您应该在 setter 中进行。

于 2013-04-01T10:50:05.520 回答
0

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

于 2013-04-01T10:46:13.427 回答