2010-11-11 4 views
5

Tùy chọn trường hợp như thế nào trong câu lệnh chuyển đổi không có dấu ngắt tự động chuyển tiếp sang trường hợp tiếp theo mà không kiểm tra?tuyên bố chuyển đổi mà không vi phạm

try { 
    switch($param) { 
     case "created": 
      if(!($value instanceof \DateTime)) 
       throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); 
     case "Creator": 
      if(!($value instanceof \Base\User)) { 
       throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");     
      } 
     default: 
      $this->$param = $value; 
      break; 
    } 
} catch(Exception $e) { 
    echo $e->getMessage(); 
} 

Nếu tham số "được tạo", nó sẽ thực hiện kiểm tra trong trường hợp đã tạo, điều này tốt. Khi kiểm tra thành công, tôi muốn mã tiếp tục với tùy chọn mặc định, đó là lý do tại sao không có ngắt ;. Nhưng thay vào đó nó vẫn tiếp tục "Creator" trong khi $ param! = "Creator"!

Tôi biết cách giải quyết vấn đề này (chỉ cần thêm mã mặc định trong trường hợp của tôi "được tạo"), nhưng tôi không muốn lặp lại mã đó quá thường xuyên. Câu hỏi thực tế của tôi là: Tại sao nó tiếp tục với trường hợp "Người sáng tạo" trong khi trường hợp không phải là "Người sáng tạo".

Trả lời

16

Fallthrough là một tính năng thiết kế có chủ ý cho phép mã như:

switch ($command) { 
    case "exit": 
    case "quit": 
    quit(); 
    break; 
    case "reset": 
    stop(); 
    case "start": 
    start(); 
    break; 
} 

Nó được thiết kế để thực hiện chạy xuống theo từng trường hợp.

default là trường hợp như bất kỳ trường hợp nào khác, ngoại trừ việc nhảy ở đó xảy ra nếu không có trường hợp nào khác được kích hoạt. Nó không phải bằng bất kỳ phương tiện nào "làm điều này sau khi chạy trường hợp được chọn thực tế". Trong ví dụ của bạn, bạn có thể xem xét:

switch($param) { 
    case "created": 
     if(!($value instanceof \DateTime)) 
      throw new \Exception("\DateTime expected, ".gettype($value)." given for self::$param"); 
     break; 
    case "Creator": 
     if(!($value instanceof \Base\User)) { 
      throw new \Exception(get_class($value)." given. \Base\User expected for self::\$Creator");     
     } 
     break; 
} 

$this->$param = $value; 

Quy tắc ở đây là, nếu nó không phụ thuộc vào công tắc, hãy di chuyển nó ra khỏi công tắc.

+0

Wow, làm sao tôi có thể bỏ lỡ điều đó. : D +1 – Ruel

+0

Câu trả lời hay! Cảm ơn! –

+0

Tôi sẽ thêm điều đó - trong khi thông qua đôi khi hữu ích - tốt hơn là không sử dụng nó khi cả hai trường hợp làm điều gì đó thay vì chỉ rơi qua (Tốt: 'trường hợp 'được tạo ra": case "creator": case "something_else": do_stuff(); 'Bad:' case "được tạo": do_stuff(); case "creator": do_Second_stuff(); case "something_else": do_remaining_stuff(); ') – dbemerlin

1

Vì đó là cách thực hiện in C.

0

Để trả lời "Câu hỏi thực tế" của bạn: Tại sao nó lại tiếp tục với các trường hợp "Đấng Tạo Hóa", trong khi các trường hợp không phải là "Đấng Tạo Hóa".

Vì bạn không có break. Nếu không có nó, nó sẽ tiếp tục với các trường hợp bên dưới nó. Giải pháp duy nhất tôi có thể nghĩ đến là đặt mã mặc định của bạn cho các trường hợp và thêm break.

Ngoài ra, bạn không cần break trong trường hợp mặc định vì trường hợp cuối cùng trong khối chuyển đổi.

0

Tôi không thực sự thấy những gì bạn muốn.

  1. Nếu bạn muốn chạy công cụ mặc định trong mọi trường hợp, chỉ cần đặt nó sau khi chuyển đổi.
  2. Nếu bạn chỉ muốn chạy công cụ mặc định trong trường hợp "đã tạo" và trong trường hợp mặc định, hãy hoán đổi vị trí của phần "được tạo" và "Người sáng tạo" và đặt dấu ngắt sau phần đầu tiên.
  3. Nếu bạn muốn mã đó chỉ chạy nếu Người sáng tạo hoặc đối sánh được tạo, sau đó loại bỏ câu lệnh chuyển đổi và sử dụng if/else HOẶC sử dụng cờ và câu lệnh if sau đây.

Tất cả các công cụ đều có.

+0

Nó không phải về những gì tôi muốn, đó là lý do tại sao một tuyên bố chuyển đổi đang làm việc như thế này. –

+0

Tôi xin lỗi vì đã hiểu sai câu hỏi. Lịch sử là câu trả lời. Giống như hầu hết mọi thứ trong lập trình, ai đó đã nói như vậy. Đây là cách họ nói. Có một số lịch sử ở đó (về cơ bản C bắt đầu nó), nhưng đó là cú pháp. – caveman