我目前正致力于一个小型在线游戏的成就系统。成就实体基本上有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中还有另一个内置函数正在做那件事,如果我正在做的事情是好的(关于良好的开发风格)
答案 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
答案 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)
真的很好 - 它简短易读。