Menu

Câu lệnh switch trong PHP: case, break và fallthrough

switch ($value) so sánh một giá trị với danh sách các nhãn case và chạy code từ case khớp đầu tiên cho đến khi gặp break. Gồm nhiều case cho một khối, fallthrough, default, switch(true) và lý do switch dùng phép so sánh lỏng ==.

Trang này có trình soạn thảo chạy trực tiếp. Sửa, chạy và xem đầu ra ngay lập tức.

switch ($value) so sánh một giá trị với danh sách các nhãn case và chạy code bên dưới nhãn đầu tiên khớp. Mỗi case kết thúc bằng break; default xử lý mọi trường hợp không khớp với case nào.

Đổi $day thành 'fri', 'sun' hoặc 'wed' rồi chạy lại. Case default không cần break khi nó nằm cuối cùng.

Nhiều case cho một khối

Để chạy cùng một đoạn code cho nhiều giá trị, hãy xếp chồng các nhãn case mà không có gì ở giữa. Một nhãn khớp sẽ chạy tiếp vào phần code bên dưới nó.

Khác với match, switch không có cú pháp dấu phẩy case 'jpg', 'jpeg':. Xếp chồng nhãn là cách duy nhất.

Fallthrough: chuyện gì xảy ra khi không có break

break là thứ dừng switch lại. Không có nó, PHP chạy case khớp rồi tiếp tục chạy vào mọi case bên dưới, bỏ qua nhãn của chúng, cho đến khi gặp break hoặc hết switch.

Ở đây fallthrough là có chủ ý: mỗi gói nhận các tính năng riêng cộng với mọi tính năng của các gói rẻ hơn. Khi cố ý viết như vậy, hãy thêm chú thích như // no break để người đọc sau không "sửa" nó. Còn khi không cố ý, thiếu break là một trong những bug thường gặp nhất với switch.

switch dùng phép so sánh lỏng (==)

Mỗi case được kiểm tra bằng ==, không phải ===. Chuỗi số khớp với số, null khớp với false và "", còn true khớp với mọi giá trị được coi là đúng. Bấm vào các ô để so sánh hai toán tử.

switch so sánh bằng ==, match so sánh bằng ===
Point at or tap a cell to read it as PHP.
$a == $b01"0""1"""nullfalsetrue"a""10""1e1"
0
1
"0"
"1"
""
null
false
true
"a"
"10"
"1e1"
Every cell computed by PHP 8.3.19.

Hệ quả thực tế: chuỗi "1" nhập từ form rơi vào case 1: mà không cần chuyển đổi, thường đó là điều bạn muốn. Nhưng switch (true) với một chuỗi không rỗng, hoặc null gặp case false:, có thể chọn một case bạn không ngờ tới.

Để ý dòng null: nó không bao giờ tới được case false:, vì null == 0 đã đúng và case 0: đứng trước. Với so sánh lỏng, thứ tự các case làm thay đổi kết quả. Từ PHP 8, 0 == "a" là sai (trong PHP 7 là đúng), nên chuỗi không phải số không còn khớp với case 0: nữa. Nếu bạn cần ===, hãy dùng biểu thức match, được trình bày ở cuối trang này.

switch(true) cho khoảng giá trị và điều kiện

Nhãn case có thể là bất kỳ biểu thức nào. Với switch (true), mỗi case là một điều kiện, và điều kiện đầu tiên bằng true sẽ thắng.

Mỗi case phải là một giá trị boolean thật sự. Vì so sánh lỏng, case $name: sẽ khớp bất cứ khi nào $name là một chuỗi không rỗng.

switch bên trong vòng lặp: break và continue

Bên trong vòng lặp, break trong switch chỉ thoát khỏi switch, không thoát khỏi vòng lặp. Để dừng vòng lặp, dùng break 2. continue bên trong switch hoạt động như break, và PHP cảnh báo ngay lúc biên dịch: "continue" targeting switch is equivalent to "break". Did you mean to use "continue 2"?. Hãy viết continue 2 để chuyển sang lần lặp tiếp theo.

switch và match

PHP 8 thêm match, đáp ứng phần lớn cách dùng của switch với ít code hơn. match so sánh bằng ===, trả về một giá trị, không bao giờ fallthrough, cho phép nhiều điều kiện cách nhau bởi dấu phẩy, và ném ra UnhandledMatchError khi không có gì khớp, nên một case bị bỏ sót không thể lặng lẽ trôi qua.

Giữ switch khi một case cần nhiều câu lệnh, hoặc khi fallthrough chính là mục đích, như ví dụ về các gói ở trên. Để ánh xạ một giá trị sang một kết quả, match ngắn gọn và an toàn hơn.

Câu hỏi thường gặp

Làm sao để dùng nhiều case cho một khối trong switch của PHP?

Xếp chồng các nhãn case, không có code nào ở giữa: case 'sat': case 'sun': echo 'weekend'; break;. Mỗi nhãn sẽ chạy tiếp xuống phần code dùng chung. Switch trong PHP không có cú pháp case 'sat', 'sun':; dạng dùng dấu phẩy đó thuộc về match.

switch trong PHP có dùng so sánh nghiêm ngặt không?

Không. switch so sánh bằng == lỏng, nên case '1': khớp với số nguyên 1 và case 0: khớp với '0'. Để so sánh nghiêm ngặt bằng ===, hãy dùng biểu thức match hoặc switch (true) với === bên trong mỗi case.

Chuyện gì xảy ra nếu quên break trong switch của PHP?

Chương trình chạy tràn xuống (fallthrough): sau case khớp, PHP tiếp tục chạy code của mọi case bên dưới cho đến khi gặp break, return hoặc hết switch. Đôi khi đó là chủ ý, nhưng thường là một bug.

switch trong PHP có kiểm tra khoảng giá trị như lớn hơn được không?

Được, với switch (true): mỗi case chứa một điều kiện như case $score >= 90:, và điều kiện đúng đầu tiên sẽ được chạy. Biểu thức match (true) làm điều tương tự với phép so sánh nghiêm ngặt và trả về một giá trị.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học lập trình cùng Coddy

Bắt đầu