การไม่จำเป็นของ break ใน PHP

คำสั่ง break เป็นสิ่งที่ไม่จำเป็นต้องมี อย่างไรก็ตาม ถ้าไม่มีมัน พฤติกรรมของบล็อก case จะไม่เป็นไปตามที่คาด ลองดูตัวอย่าง สมมติว่าเรามีโค้ดดังนี้:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    break;
    case 2:
      echo 2;
    break;
    case 3:
      echo 3;
    break;
  }
?>

ลองเอา break ทั้งหมดออก และในตัวแปร $num เริ่มแรกให้ใส่ตัวเลข 3

ตอนนี้ทุกอย่างยังคงทำงานเหมือนเดิม:

php<?php
  $num = 3; // ให้มีเลข 3 ตรงนี้
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // หลังจากรันโค้ดจะแสดง 3 - ดีหมด
?>

คราวนี้ลองใส่ตัวเลข 2 ลงในตัวแปร $num ในกรณีนี้ตามที่คาด case 2 จะทำงาน และตามมาด้วย case 3 ซึ่งไม่คาดคิด:

php<?php
  $num = 2;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // หลังจากรันโค้ดจะแสดง 2 แล้วก็ 3
?>

แต่ถ้าใส่ตัวเลข 1 ลงในตัวแปร $num แล้ว โครงสร้าง case ทั้งหมดจะทำงาน:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
      echo 1;
    case 2:
      echo 2;
    case 3:
      echo 3;
  }
  
  // หลังจากรันโค้ดจะแสดง 1, 2 และ 3
?>

นั่นคือ เมื่อไม่มี break หลังจาก case ที่ตั้งใจไว้ทำงานเสร็จแล้ว case ทั้งหมดด้านล่างมันก็จะทำงานตามไปด้วย บางครั้ง คุณลักษณะนี้ถูกนำไปใช้ในการแก้ปัญหา

ในตัวอย่างต่อไปนี้ ถ้าตัวแปร $num มีค่า 1 หรือ 2 แล้ว ค่า 'a' จะถูกเก็บลงในตัวแปร $res แต่ถ้าตัวแปร $num มีค่า 3 แล้ว ค่า 'b' จะถูกเก็บลงในตัวแปร $res:

php<?php
  $num = 1;
  
  switch ($num) {
    case 1:
    case 2:
      $res = 'a';
    break;
    case 3:
      $res = 'b';
    break;
  }
  
  echo $res;
?>

ด้านบนฉันเขียนว่า บางครั้งคุณลักษณะนี้ ถูกนำไปใช้ แต่โดยทั่วไปแล้วฉันไม่แนะนำ ให้ใช้มัน เพราะโค้ดจะไม่ชัดเจน มากนัก

การแก้ปัญหาดังกล่าวให้ชัดเจนขึ้นทำได้โดยใช้ if:

php<?php
  $num = 1;
  
  if ($num == 1 or $num == 2) {
    $res = 'a';
  }
  
  if ($num == 3) {
    $res = 'b';
  }
  
  echo $res;
?>