2012-01-26 30 views
19

Tôi chỉ hơi có bằng cách giả định như sau:Tại sao `chuyển đổi` được coi là cấu trúc vòng lặp cho mục đích` tiếp tục`?

foreach ($arr as $key => $value) { 
    switch($key) { 
    // ... some other cases 
    default: 
     continue; 
     // ^== assumption: move on to the next iteration of the foreach 
     //  actual PHP: treat this continue just like a break 
    } 
    // ... 
} 

Nhưng trên thực tế, theo documentation for continue:

câu lệnh switch được coi là một cấu trúc vòng lặp cho các mục đích của tiếp tục.

Có lý do nào cho lựa chọn này trên một phần của nhà thiết kế ngôn ngữ PHP không? Theo như tôi có thể biết, switchkhông phải là cấu trúc điều khiển vòng lặp, vậy tại sao lại xử lý cấu trúc này giống như trong trường hợp này?

+17

Bạn nên tránh sử dụng từ "lý do" và "thiết kế" khi nói về 'php';) –

+6

bạn có thể sử dụng 'tiếp tục 2' =) – cweinberger

+0

Tôi sẽ đoán rằng việc xử lý' chuyển đổi' như một vòng lặp cấu trúc cung cấp một số tính nhất quán có lập trình về cách 'break' và' continue' hoạt động cho ** tất cả các cấu trúc vòng lặp **. – zzzzBov

Trả lời

3

Tôi nghĩ rằng bạn sẽ không tìm thấy bất kỳ "lý do" thực sự cho hành vi này.

duy nhất động lực thực sự đằng sau hành vi này có lẽ đó thực hiện switch như thể nó là một cấu trúc vòng lặp cho phép PHP để tái sử dụng thay vì hiện breakcontinue ngữ nghĩa của vòng reimplementing một phiên bản đặc biệt dành cho switch.

Hoặc để cụm từ nó tích cực hơn: Đó là sự nhất quán.

+0

vì vậy, "họ lười biếng"? Làm cho tinh thần, tôi đoán: P – chesles

+0

Biểu thức 'switch' được đánh giá cho mỗi trường hợp (' case', 'default') cho đến khi vòng lặp kết thúc (kết thúc của khối mã hoặc cho đến khi' break', 'continue' hoặc' return' được đưa ra). – hakre

+0

@hakre không đúng sự thật. "Trong câu lệnh chuyển đổi, điều kiện chỉ được đánh giá một lần và kết quả được so sánh với từng câu lệnh" - http://www.php.net/manual/en/control-structures.switch.php – chesles

7

Giải thích tốt nhất mà tôi có thể nghĩ là PHP coi đó là cấu trúc lặp để nó phù hợp với mô hình của một cái gì đó sử dụng continuebreak. Tài liệu switch không làm sáng tỏ nhiều hơn về nó ngoài

Lưu ý rằng không giống như một số ngôn ngữ khác, tuyên bố tiếp tục áp dụng để chuyển đổi và hoạt động tương tự như ngắt. Nếu bạn có một chuyển đổi bên trong một vòng lặp và muốn tiếp tục lặp lại tiếp theo của vòng lặp bên ngoài, hãy sử dụng tiếp tục 2.

Vì vậy, có lẽ vì, như vòng lặp, nó dừng việc thực hiện phần còn lại của mã trong cấu trúc của nó.

Tuy nhiên, khi bạn sử dụng một số cấp, hai cư xử khá khác nhau:

continue mà không có một mức

<?php 
for($i=0;$i<5;$i++) { 
    switch($i) { 
     case 2: 
      continue; 
     default: 
      echo $i, "\n"; 
    } 
    echo "Finished with {$i}\n"; 
} 
//0 
//Finished with 0 
//1 
//Finished with 1 
//Finished with 2 
//3 
//Finished with 3 
//4 
//Finished with 4 

continue với một mức

<?php 
for($i=0;$i<5;$i++) { 
    switch($i) { 
     case 2: 
      continue 2; 
     default: 
      echo $i, "\n"; 
    } 
    echo "Finished with {$i}\n"; 
} 
//0 
//Finished with 0 
//1 
//Finished with 1 
//3 
//Finished with 3 
//4 
//Finished with 4 

break mà không có một mức

<?php 
for($i=0;$i<5;$i++) { 
    switch($i) { 
     case 2: 
      break; 
     default: 
      echo $i, "\n"; 
    } 
    echo "Finished with {$i}\n"; 
} 
//0 
//Finished with 0 
//1 
//Finished with 1 
//Finished with 2 
//3 
//Finished with 3 
//4 
//Finished with 4 

break với một mức

<?php 
for($i=0;$i<5;$i++) { 
    switch($i) { 
     case 2: 
      break 2; 
     default: 
      echo $i, "\n"; 
    } 
    echo "Finished with {$i}\n"; 
} 
//0 
//Finished with 0 
//1 
//Finished with 1 
-2

Theo như tôi có thể biết, switch không phải là cấu trúc điều khiển vòng lặp, vậy tại sao lại xử lý cấu trúc như trong trường hợp này?

Có một lần lặp lại không đủ điều kiện làm vòng lặp không? Cùng áp dụng cho while bên trong một foreach ví dụ mà chỉ lặp một lần:

foreach (range(1,2) as $value) 
{ 
    $i = 0; 
    while (!$i++) 
    { 
     continue; 
    } 
    echo $value, "\n"; 
} 

Nó vang các giá trị cũng thay vì continue các foreach vòng lặp; Nó có liên quan đến while.

Nếu sự mong đợi của bạn là switch là như if (mà nó không phải là), sau đó bạn có thể không hy vọng rằng hành vi của continue, tuy nhiên tôi khá chắc chắn cho while bạn mong đợi nó.

Nhưng nếu bạn thực sự nghĩ rằng if giống như switch thì làm cách nào để break hoạt động khác với continue?

Vì vậy, tôi sẽ không nói rằng nó vượt quá trật tự, nó chỉ là switch là một cấu trúc điều khiển có quần áo của một vòng lặp. Và như chúng ta thường sử dụng break (mà bạn mong đợi để làm việc), hành vi của continue không phải là nổi tiếng. Và đó là tất cả. Hoặc tại sao bạn mong đợi continue không hoạt động như break trong một switch?

Vì vậy, lý do có thể phải có breakcontinue căn chỉnh.

+0

Kỳ vọng của tôi * là * công tắc đó giống như một chuỗi 'if' /' else if', trừ khi tôi bị nhầm lẫn. Một số ngôn ngữ không có 'chuyển đổi' (ví dụ: python) thậm chí còn nói" sử dụng if/elif thay vì chuyển đổi ". Vì vậy, làm thế nào là chuyển đổi không giống như một nếu trong PHP? – chesles

+0

"Câu lệnh chuyển đổi tương tự như một chuỗi câu lệnh IF trên cùng một biểu thức." - http://www.php.net/manual/en/control-structures.switch.php – chesles

+0

@chesles: Được rồi, đó là những gì tôi giả định (có chuyển đổi trong đầu như thể nếu) - vì vậy sự tương tự là 'phá vỡ 'và' tiếp tục' sau đó. Bạn có mong đợi họ làm việc giống nhau không (giống như 'if' và' switch' cho 'break' và' continue')? – hakre

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