2013-04-01 37 views
8

Tôi hiện đang làm việc trên một hệ thống thành tích cho một trò chơi trực tuyến nhỏ. Các tổ chức thành tựu cơ bản có 4 thuộc tính:PHP: Kiểm tra xem một số nguyên có trong một khoảng thời gian nhất định hay không

  • id
  • earnedBy
  • earnedOn
  • tiến

Người cuối cùng được coi là một tỷ lệ phần trăm, có nghĩa là một số từ 0 đến 100 Để đảm bảo rằng không có số lớn hơn 100 hoặc nhỏ hơn 0 được lưu trong cơ sở dữ liệu, phương thức setter của tôi trông như sau (Tôi đang sử dụng Symfony2/Doctrine ORM):

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

     return $this; 
    } 

Dòng quan trọng ở đây là max(min($progress, 100), 0).

Nó hoạt động hoàn toàn tốt, tôi chỉ muốn hỏi, nếu có một built-in chức năng trong PHP làm chính xác điều đó, và nếu những gì tôi đang làm là được rồi (liên quan đến tốt-phát triển phong cách)

+1

tôi không nghĩ rằng có bất kỳ built-in chức năng như vậy cho những gì bạn cần, và những gì bạn đang làm là hoàn toàn tốt .. –

+0

Có vẻ tốt. Tôi có lẽ sẽ chia nó thành hai dòng thay vì lồng nó để làm cho hàm max() min() gọi dễ đọc hơn. –

+0

@ tereško, ngữ cảnh quan trọng. Do anh ta đang sử dụng framework Symfony2, nên có thể có một giải pháp thích hợp hơn cho vấn đề của anh ta. – Gerry

Trả lời

3

Bạn nên cân nhắc thêm một số ràng buộc vào thực thể của mình từ the validation component của Symfony2.

use Symfony\Component\Validator\Constraints as Assert; 

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

Dịch vụ xác thực được gọi tự động khi ví dụ mẫu xác thực, nhưng bạn thậm chí có thể gọi dịch vụ này bằng tay, ví dụ như trong bộ điều khiển của bạn.

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

Bạn thực sự không nên sử dụng DI Container của Symfony như một Service Locator đơn giản. Bạn có thể tìm thấy [bài giảng này] (http://www.youtube.com/watch?v=RlfLCWKxHJ0) khá thú vị. –

0

Ngắn câu trả lời là không, không có hàm tích hợp trong PHP "cắt ngắn" một số ở các đường biên dưới và trên. Và thực sự là ok để viết min(max(x, max_value), min_value) - nó ngắn và dễ đọc.

1

Bạn có thể sử dụng Range chế:

use Symfony\Component\Validator\Constraints\Range; 

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

Validation trong Symfony được xử lý bởi một lớp riêng biệt, vì vậy bạn nên không làm điều đó trong setters.

4

Vì PHP 5.2 có filter_var() chức năng với bộ đáng kể options có sẵn.

Một trong số đó cho phép bạn kiểm tra các số là trong một phạm vi:

$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 tốt hơn chú thích crappy – Baba

Các vấn đề liên quan