Bài 6. Rẽ nhánh: if, else, switch và match

Rẽ nhánh cho phép chương trình phản ứng khác nhau theo dữ liệu. Bài này học if/elseif/else, switch, biểu thức match (PHP 8) và cú pháp thay thế để xen PHP vào HTML gọn gàng.

40 phútCơ bản
Bạn sẽ học được
  • Viết if, elseif, else đúng cấu trúc
  • Dùng switch cho nhiều giá trị rời rạc
  • Dùng match trả về giá trị, so sánh chặt
  • Xen điều kiện vào HTML bằng cú pháp thay thế

Khái niệm và lý thuyết

if kiểm tra điều kiện theo thứ tự, nhánh đầu đúng sẽ chạy, các nhánh sau bị bỏ qua: hãy xếp điều kiện từ hẹp đến rộng (≥ 8.5 trước ≥ 7). switch so sánh lỏng (==) và cần break; match so sánh chặt (===), trả về giá trị, không cần break và báo lỗi nếu không khớp nhánh nào.

if / elseif / else

<?php
$diem = 7.8;
if ($diem >= 8.5) {
    $xep_loai = "Giỏi";
} elseif ($diem >= 7) {
    $xep_loai = "Khá";
} elseif ($diem >= 5) {
    $xep_loai = "Trung bình";
} else {
    $xep_loai = "Yếu";
}
echo "Điểm $diem: $xep_loai";
// Điều kiện lồng nhau
if ($diem >= 5) {
    if ($diem == 10) echo " (tuyệt đối)";
}

switch

<?php
$thu = date("N");   // 1 = Thứ Hai ... 7 = Chủ nhật
switch ($thu) {
    case 6:
    case 7:
        echo "Cuối tuần";
        break;
    case 1:
        echo "Đầu tuần";
        break;
    default:
        echo "Ngày thường";
}

Thiếu break, PHP chạy tiếp các case bên dưới (fall-through): đôi khi hữu ích (gộp case 6, 7) nhưng thường là lỗi.

match (PHP 8)

<?php
$xep_loai = match (true) {
    $diem >= 8.5 => "Giỏi",
    $diem >= 7   => "Khá",
    $diem >= 5   => "Trung bình",
    default      => "Yếu",
};
$mau = match ($xep_loai) {
    "Giỏi", "Khá" => "green",
    "Trung bình"  => "orange",
    default       => "red",
};
echo "<b style='color:$mau'>$xep_loai</b>";

Xen vào HTML: cú pháp thay thế

<?php $dang_nhap = true; $ten = "An"; ?>
<?php if ($dang_nhap): ?>
  <p>Xin chào, <?= htmlspecialchars($ten) ?>! <a href="/dang-xuat.php">Đăng xuất</a></p>
<?php else: ?>
  <a href="/dang-nhap.php">Đăng nhập</a>
<?php endif; ?>

<?= ... ?> là viết tắt của <?php echo ... ?>. Dạng if: ... endif; dễ đọc hơn dấu ngoặc nhọn khi xen nhiều HTML.

Mẹo hay

Với 2–3 nhánh đơn giản dùng if; nhiều giá trị rời rạc dùng match; chỉ dùng switch khi cần fall-through.

Lưu ý

if ($a = 5) là phép gán (luôn đúng), không phải so sánh. Một số lập trình viên viết if (5 == $a) để tránh nhầm.

Thực hành
  1. Nhận tháng từ URL (?thang=3), cho biết tháng có bao nhiêu ngày (xét năm nhuận).
  2. Viết máy tính đơn giản: ?a=5&b=3&pt=cong, dùng match chọn phép tính.
  3. Hiển thị menu khác nhau cho khách và người đã đăng nhập bằng cú pháp thay thế.
  4. Viết lại ví dụ switch ngày trong tuần bằng match.
Tóm tắt bài học
  • if/elseif/else: xếp điều kiện từ hẹp đến rộng.
  • switch so sánh ==, cần break.
  • match so sánh ===, trả về giá trị, gọn và an toàn.
  • if: endif; và để xen vào HTML.