2013-04-01 50 views
8

我目前正在研究一個小型在線遊戲的成就係統。該成果的實體主要有4個屬性:PHP:檢查一個整數是否在一定的時間間隔

  • 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另一個內置功能正是這樣做的事情,如果我在做什麼是好的(關於良好發展的風格)

+1

我不認爲有您所需要的任何這樣的內置功能,以及你現在正在做的是非常好.. –

+0

看起來不錯。我可能會將它分成兩行而不是嵌套它,以使max()min()函數調用更具可讀性。 –

+0

@tereško,背景很重要。鑑於他正在使用Symfony2框架,可能會有更適合他的問題的解決方案。 – Gerry

回答

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

你真的不應該使用Symfony的DI容器作爲一個簡單的服務定位器。您可能會發現[本講座](http://www.youtube.com/watch?v=RlfLCWKxHJ0)非常有趣。 –

0

短答案是沒有,PHP中沒有內置的函數,它可以在下限和上限「截斷」一個數字。 編寫min(max(x, max_value), min_value)確實沒問題 - 它簡短易讀。

1

可以使用Range約束:

use Symfony\Component\Validator\Constraints\Range; 

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

Validation中的Symfony是由一個單獨的層處理,所以在制定者應該做到這一點。

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

+0

+1比蹩腳的註釋更好 – Baba

相關問題