2013-04-01 8 views
8

Obecnie pracuję nad systemem osiągnięć dla małej gry online. Podmiot osiągnięcie zasadniczo ma 4 atrybuty:PHP: Sprawdź, czy liczba całkowita jest w określonym przedziale lub nie

  • id
  • earnedBy
  • earnedOn
  • postęp

Ten ostatni ma być procent, co oznacza liczbę między 0 a 100 Aby upewnić się, że żadna liczba większa niż 100 lub mniejsza niż 0 nie jest zapisana w bazie danych, moja metoda ustawiania wygląda tak: (Używam Symfony2/Doctrine ORM):

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

     return $this; 
    } 

Ważną linią jest tutaj max(min($progress, 100), 0).

Działa całkowicie w porządku, ja tylko chciałem zapytać, czy istnieje inna funkcja wbudowana w PHP robi dokładnie to coś, a jeśli to, co robię jest w porządku (dotyczące dobrą rozwijających style)

+1

nie sądzę że jest jakaś taka funkcja wbudowana na co trzeba i co aktualnie robisz jest idealnie w porządku .. –

+0

Wygląda dobrze. Prawdopodobnie rozbiłbym go na dwie linie zamiast zagnieżdżać, aby wywołania funkcji max() min() były bardziej czytelne. –

+0

@ tereško, kontekst ma znaczenie. Biorąc pod uwagę, że używa on frameworka Symfony2, może istnieć bardziej odpowiednie rozwiązanie dla jego problemu. – Gerry

Odpowiedz

3

Powinieneś rozważyć dodanie pewnych ograniczeń do twojej jednostki z the validation component z Symfony2.

use Symfony\Component\Validator\Constraints as Assert; 

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

Usługa walidator nazywa się automatycznie, gdy na przykład sprawdzanie poprawności formularzy, ale można nawet nazwać go ręcznie poprzez uzyskanie usługę validator, na przykład w kontrolerze.

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

Naprawdę nie powinieneś używać Modułu DI Symfony jako prostego Lokalizatora Usług. Możesz znaleźć [ten wykład] (http://www.youtube.com/watch?v=RlfLCWKxHJ0) całkiem interesujący. –

0

Short odpowiedź brzmi: no, nie ma wbudowanej funkcji w PHP, która "obcina" liczbę na dolnej i górnej granicy. I naprawdę dobrze jest napisać min(max(x, max_value), min_value) - jest krótki i czytelny.

1

Można użyć Range ograniczenia:

use Symfony\Component\Validator\Constraints\Range; 

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

Validation w Symfony jest obsługiwany przez osobnej warstwie, więc należy nie zrobić w ustawiaczy.

4

Od PHP 5.2 istnieje filter_var() funkcje ze znacznym zestaw options dostępne.

Jeden z nich pozwala sprawdzić numer jest w zakresie:

$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 lepiej niż brzydka adnotacja – Baba

Powiązane problemy