2009-11-01 37 views
5
switch ($foo) 
    { 
     case 3 || 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 

Trong mã trên, câu lệnh chuyển đổi đầu tiên có hợp lệ không? Tôi muốn nó gọi hàm bar() nếu giá trị của $foo là 3 hoặc 5Có thể sử dụng || trong PHP switch?

+1

Tôi không biết nhiều về PHP nhưng tôi sẽ giả sử (3 || 5) để dịch sang TRUE. –

+2

'3 || 5' dường như được đánh giá chỉ là 'true' bên trong một câu lệnh switch và do đó sẽ luôn gọi' bar() 'cho bất kỳ giá trị' $ foo' nào. –

+0

@Mark Rushakoff - Không, so sánh lỏng giữa giá trị chuyển đổi và giá trị trường hợp được thực hiện và nếu, ví dụ: $ foo == 0 thì 3 || 5 mã trường hợp sẽ không được thực hiện. (Cũng giống như nếu (0 == (3 || 5)) sẽ giải quyết thành sai.) – GZipp

Trả lời

24

Bạn nên tận dụng lợi thế của sự sụp đổ qua các báo cáo chuyển đổi:

switch ($foo) 
    { 
     case 3: 
     case 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 

Các PHP man page có một số ví dụ như thế này.

5

Thay vào đó, sử dụng một trong những ưu điểm chính của switch báo cáo:

switch($foo) { 
    case 3: 
    case 5: 
     bar(); 
     break; 

    case 2: 
     apple(); 
     break; 
} 
6

Tôi nghĩ rằng những gì bạn cần là:

switch ($foo) 
{ 
    case 3: 
    case 5: 
     bar(); 
    break; 

    case 2: 
     apple(); 
    break; 
} 

Điều thú vị, tôi đã nghe nói rằng Perl là (hoặc thậm chí có thể có, bây giờ) giới thiệu cú pháp này, một cái gì đó dọc theo các dòng:

if ($a == 3 || 5) 

Tôi không phải là big fan của cú pháp đó vì tôi đã phải viết các trình phân tích cú pháp từ vựng một chút và tin rằng các ngôn ngữ nên rõ ràng nhất có thể. Nhưng sau đó, Perl đã giải quyết tất cả các loại vấn đề này trước với những bên hông khó khăn if s và or vì vậy tôi nghi ngờ sẽ không có vấn đề gì với nó :-)

0

Không, nếu bạn viết case 3 || 5:, thì bạn cũng có thể chỉ viết case True:, chắc chắn không phải những gì bạn muốn. Tuy nhiên bạn có thể đặt báo cáo trường hợp trực tiếp bên dưới mỗi khác:

 
switch ($foo) 
    { 
     case 3: 
     case 5: 
      bar(); 
     break; 

     case 2: 
      apple(); 
     break; 
    } 
1

Yeah, tôi nghĩ rằng những gì bạn đã có có tương đương với:

 
    <?php 

    $foo = 5000 ; 

    switch($foo) 
    { 
     case true : // Gzipp: an '=='-style comparison is made 
     echo 'first one' ; // between $foo and the value in the case 
     break;    // so for values of $foo that are "truthy" 
          // you get this one all the time. 

     case 2: 
     echo 'second one'; 
     break; 

     default: 
     echo 'neither' ; 
     break; 
    } 

    ?> 
+0

Dòng 'case true:' sẽ _not_ luôn được nhận. Mỗi giá trị trường hợp được so sánh lỏng lẻo với giá trị chuyển đổi; nếu nó giải quyết đúng mã được thực hiện. Vì vậy, nếu $ foo là 0, hoặc '', hoặc bất cứ điều gì khác mà giải quyết một cách lỏng lẻo, thì trường hợp đó sẽ bị bỏ qua. – GZipp

+0

Cảm ơn Gzipp, đã cập nhật. – bobobobo

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