2013-04-01 5 views
8

Ich arbeite gerade an einem Erfolgssystem für ein kleines Online-Spiel. Die Leistung Einheit hat grundsätzlich vier Attribute:PHP: Prüfe, ob eine ganze Zahl in einem bestimmten Intervall ist oder nicht

  • id
  • earnedBy
  • earnedOn
  • Fortschritt

Der letzte soll ein Prozentsatz sein, eine Zahl zwischen 0 bedeutet, und 100 Um sicherzustellen, dass keine Zahlen größer als 100 oder kleiner als 0 in der Datenbank gespeichert werden, sieht meine Setter-Methode wie folgt aus (Ich verwende Symfony2/Doctrine ORM):

public function setProgress($progress) 
    { 
     $this->progress = max(min($progress, 100), 0); 

     return $this; 
    } 

Die wichtige Zeile hier ist max(min($progress, 100), 0).

Es funktioniert ganz gut, wollte ich frage nur, wenn es zu tun eine andere integrierte Funktion in PHP, dass die Sache genau, und wenn das, was ich tue in Ordnung ist (in Bezug auf gut entwickelnden Stil)

+1

Ich glaube nicht, gibt es eine solche integrierte Funktion für das, was Sie brauchen, und was Sie gerade tun, ist völlig in Ordnung .. –

+0

Sieht gut aus. Ich würde es wahrscheinlich in zwei Zeilen zerlegen, anstatt es zu verschachteln, um die Aufrufe der Funktion max() min() lesbarer zu machen. –

+0

@ tereško, Kontext spielt eine Rolle. Wenn er das Symfony2-Framework verwendet, könnte es eine geeignetere Lösung für sein Problem geben. – Gerry

Antwort

3

Sie sollten in Erwägung ziehen, einige Einschränkungen für Ihre Entität von the validation component von Symfony2 hinzuzufügen.

use Symfony\Component\Validator\Constraints as Assert; 

class Achievement 
{ 
    /** 
    * @Assert\Range(min=0, max=100) 
    */ 
    protected progress; 
} 

Der Validator-Dienst wird automatisch, wenn beispielsweise die Validierung Formen genannt, aber man kann es auch, indem sie den Validator-Dienst manuell aufrufen, zum Beispiel in dem Controller.

$achievement = new Achievement(); 
$errors = $this->get('validator')->validate($achievement); 
+1

Sie sollten den DI-Container von Symfony nicht als einfachen Service Locator verwenden. Sie könnten [diese Vorlesung] (http://www.youtube.com/watch?v=RlfLCWKxHJ0) ziemlich interessant finden. –

0

Short Antwort ist nein, es gibt keine eingebaute Funktion in PHP, die eine Zahl an unteren und oberen Grenzen "abschneidet". Und es ist wirklich in Ordnung zu schreiben min(max(x, max_value), min_value) - es ist kurz und lesbar.

1

können Sie die Range Einschränkung verwenden:

use Symfony\Component\Validator\Constraints\Range; 

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

Validation in Symfony durch eine separate Schicht behandelt wird, so sollten Sie nicht in Setter es tun.

4

Seit PHP 5.2 gibt es filter_var() Funktionen mit erheblicher Menge von options zur Verfügung.

Einer von ihnen können Sie überprüfen, für Zahl in einem Bereich zu sein:

$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 besser als beschissene Annotation – Baba

Verwandte Themen