Cấu trúc rẽ nhánh if, else, và elseif trong PHP
PHP Tutorial | by
Bạn đã bao giờ tự hỏi làm thế nào mà các ứng dụng hoặc trang web "biết" phải làm gì trong các tình huống khác nhau chưa? Ví dụ, làm thế nào một trang web biết chào "Chào buổi sáng" hay "Chào buổi chiều" tùy theo thời gian trong ngày? Hay làm thế nào một trò chơi biết cho bạn qua màn khi bạn đạt đủ điểm?
Câu trả lời nằm ở khả năng ra quyết định của chương trình. Các chương trình máy tính không phải lúc nào cũng chạy một mạch từ đầu đến cuối theo một đường thẳng. Thay vào đó, chúng cần khả năng thực hiện các hành động khác nhau dựa trên các điều kiện cụ thể. Đây chính là lúc cấu trúc rẽ nhánh phát huy tác dụng.
Cấu trúc rẽ nhánh trong PHP (và các ngôn ngữ lập trình khác) cho phép chúng ta "chỉ đường" cho chương trình. Nó giống như việc bạn đến một ngã ba đường: "Nếu biển báo nói rẽ trái, thì tôi đi đường này; nếu không, tôi đi đường kia." PHP cung cấp các câu lệnh if
, else
, và elseif
để giúp chương trình của bạn đưa ra những quyết định này một cách linh hoạt.
Câu lệnh if: Nếu (điều kiện) đúng thì làm gì?
Mục đích: Câu lệnh if
là dạng rẽ nhánh cơ bản nhất. Nó cho phép chương trình thực hiện một khối lệnh cụ thể chỉ khi một điều kiện cho trước là đúng (true
). Nếu điều kiện đó sai (false
), khối lệnh bên trong if
sẽ bị bỏ qua hoàn toàn. Nó giống như một "cánh cửa" chỉ mở khi điều kiện được đáp ứng.
Ví dụ đời thường: Hãy nghĩ về câu: "Nếu trời mưa, tôi sẽ mang ô." Ở đây, hành động "mang ô" chỉ xảy ra khi điều kiện "trời mưa" là đúng. Nếu trời không mưa, hành động đó sẽ không diễn ra.
Cú pháp:
if (điều_kiện) { // Mã này sẽ được thực thi NẾU điều_kiện đúng (true) }
if
: Đây là từ khóa bắt đầu câu lệnh điều kiện.(điều_kiện)
: Phần này chứa một biểu thức hoặc một phép so sánh mà kết quả của nó phải làtrue
hoặcfalse
. PHP sẽ dựa vào kết quả này để quyết định.{ ... }
: Cặp dấu ngoặc nhọn này bao quanh khối mã (hay còn gọi là thân của câu lệnhif
). Tất cả các dòng lệnh bên trong cặp ngoặc nhọn này sẽ được thực thi nếuđiều_kiện
làtrue
.
Ví dụ PHP đơn giản:
Kiểm tra xem một số có lớn hơn 10 không:
<?php $soCuaBan = 15; // Gán giá trị 15 cho biến $soCuaBan echo "Kiểm tra số " . $soCuaBan . ":<br>"; if ($soCuaBan > 10) { // Điều kiện: $soCuaBan (15) CÓ lớn hơn 10 không? (TRUE) echo "Số " . $soCuaBan . " lớn hơn 10."; // Dòng này sẽ được hiển thị. } echo "<br>--- Kết thúc kiểm tra đầu tiên ---<br>"; $soKhac = 7; // Gán giá trị 7 cho biến $soKhac echo "<br>Kiểm tra số " . $soKhac . ":<br>"; if ($soKhac > 10) { // Điều kiện: $soKhac (7) CÓ lớn hơn 10 không? (FALSE) echo "Số " . $soKhac . " lớn hơn 10."; // Dòng này sẽ KHÔNG được hiển thị. } echo "--- Kết thúc kiểm tra thứ hai ---"; ?>
Giải thích:
- Với
$soCuaBan = 15
, điều kiện15 > 10
là đúng (true
). Do đó, dòng chữ "Số 15 lớn hơn 10." được in ra màn hình. - Với
$soKhac = 7
, điều kiện7 > 10
là sai (false
). Vì thế, dòng chữ bên trong khốiif
không được thực thi, và chương trình chỉ tiếp tục với các lệnh bên ngoài khốiif
.
Kiểm tra xem người dùng có phải là quản trị viên không:
<?php $vaiTroNguoiDung = "admin"; // Giả sử vai trò của người dùng là "admin" echo "Kiểm tra quyền:<br>"; if ($vaiTroNguoiDung == "admin") { // Điều kiện: $vaiTroNguoiDung CÓ bằng "admin" không? (TRUE) echo "Chào mừng Quản trị viên! Bạn có toàn quyền truy cập."; // Dòng này sẽ được hiển thị. } echo "<br>--- Kết thúc kiểm tra quyền đầu tiên ---<br>"; $vaiTroKhac = "editor"; // Giả sử vai trò của người dùng khác là "editor" echo "<br>Kiểm tra quyền khác:<br>"; if ($vaiTroKhac == "admin") { // Điều kiện: $vaiTroKhac CÓ bằng "admin" không? (FALSE) echo "Chào mừng Quản trị viên! Bạn có toàn quyền truy cập."; // Dòng này sẽ KHÔNG được hiển thị. } echo "--- Kết thúc kiểm tra quyền thứ hai ---"; ?>
Giải thích:
- Khi
$vaiTroNguoiDung
là "admin", điều kiện$vaiTroNguoiDung == "admin"
là đúng (true
), và thông báo chào mừng quản trị viên xuất hiện. - Khi
$vaiTroKhac
là "editor", điều kiện$vaiTroKhac == "admin"
là sai (false
). Do đó, thông báo chào mừng quản trị viên không được in ra.
Như bạn thấy, câu lệnh if
giúp chúng ta tạo ra những "con đường" cho chương trình, nơi nó sẽ đi theo một hướng nhất định chỉ khi điều kiện cho phép.
Câu lệnh if...else: Nếu đúng thì làm A, không thì làm B?
Mục đích: Câu lệnh if...else
là sự mở rộng của if
, nó giải quyết vấn đề khi bạn muốn chương trình thực hiện một hành động cụ thể khi điều kiện đúng, và một hành động khác khi điều kiện sai. Nó cung cấp cho chương trình một con đường thay thế, đảm bảo rằng luôn có một đoạn mã được thực thi.
Ví dụ đời thường: Hãy nghĩ về câu: "Nếu đủ tiền mua táo, tôi mua táo; nếu không, tôi mua chuối." Ở đây, bạn luôn có một lựa chọn: hoặc mua táo (nếu đủ tiền), hoặc mua chuối (nếu không đủ tiền).
Cú pháp:
if (điều_kiện) { // Mã này sẽ được thực thi NẾU điều_kiện đúng (true) } else { // Mã này sẽ được thực thi NẾU điều_kiện sai (false) }
if (điều_kiện) { ... }
: Phần này hoạt động giống hệt như câu lệnhif
độc lập. Khối mã bên trong sẽ chạy nếuđiều_kiện
làtrue
.else { ... }
: Đây là phần bổ sung. Khối mã bên trongelse
sẽ chỉ được thực thi khiđiều_kiện
trongif
làfalse
. Điều này đảm bảo rằng có một hành động "mặc định" xảy ra khi điều kiện chính không được đáp ứng.
Ví dụ PHP đơn giản:
Kiểm tra học sinh đỗ hay trượt:
Giả sử điểm đậu là 50.
<?php $diemHocSinhA = 65; // Điểm của học sinh A echo "Kiểm tra điểm học sinh A (" . $diemHocSinhA . "):<br>"; if ($diemHocSinhA >= 50) { // Điều kiện: 65 CÓ lớn hơn hoặc bằng 50 không? (TRUE) echo "Học sinh A: Đỗ!"; // Mã này sẽ được thực thi. } else { echo "Học sinh A: Trượt."; // Mã này sẽ KHÔNG được thực thi. } echo "<br>---<br>"; $diemHocSinhB = 40; // Điểm của học sinh B echo "Kiểm tra điểm học sinh B (" . $diemHocSinhB . "):<br>"; if ($diemHocSinhB >= 50) { // Điều kiện: 40 CÓ lớn hơn hoặc bằng 50 không? (FALSE) echo "Học sinh B: Đỗ!"; // Mã này sẽ KHÔNG được thực thi. } else { echo "Học sinh B: Trượt."; // Mã này sẽ được thực thi. } echo "<br>---"; ?>
Giải thích:
- Với
$diemHocSinhA = 65
, điều kiện65 >= 50
là đúng. Do đó, dòng "Học sinh A: Đỗ!" được in ra. - Với
$diemHocSinhB = 40
, điều kiện40 >= 50
là sai. Vì điều kiệnif
sai, PHP sẽ bỏ qua khốiif
và thực thi khốielse
, in ra "Học sinh B: Trượt.".
Hiển thị "Chào buổi sáng" hoặc "Chào buổi chiều":
Chúng ta có thể dùng hàm date("H")
của PHP để lấy giờ hiện tại (ở định dạng 24 giờ).
<?php $gioHienTai = date("H"); // Lấy giờ hiện tại (ví dụ: 10, 15, 22...) echo "Bây giờ là: " . $gioHienTai . " giờ.<br>"; if ($gioHienTai < 12) { // Điều kiện: Giờ hiện tại CÓ nhỏ hơn 12 không? (Trước 12 trưa) echo "Chào buổi sáng!"; // Mã này sẽ được thực thi nếu giờ < 12. } else { echo "Chào buổi chiều!"; // Mã này sẽ được thực thi nếu giờ >= 12. } ?>
Giải thích:
- Nếu bạn chạy đoạn mã này vào lúc 10 giờ sáng,
$gioHienTai
sẽ là10
. Điều kiện10 < 12
là đúng, nên "Chào buổi sáng!" được in ra. - Nếu bạn chạy đoạn mã này vào lúc 3 giờ chiều (15 giờ),
$gioHienTai
sẽ là15
. Điều kiện15 < 12
là sai, nên khốielse
được thực thi và "Chào buổi chiều!" được in ra.
Câu lệnh if...else
rất hữu ích khi bạn có hai hướng hành động rõ ràng và muốn đảm bảo rằng một trong hai hướng đó luôn được thực hiện.
Câu lệnh if...elseif...else: Nhiều lựa chọn thì sao?
Khi bạn có nhiều hơn hai lựa chọn hành động và cần kiểm tra một chuỗi các điều kiện khác nhau, if...elseif...else
là cấu trúc bạn cần. Đây là cách để chương trình của bạn đưa ra những quyết định phức tạp hơn, giống như việc phân loại hoặc xếp hạng.
Mục đích: Cấu trúc này cho phép bạn kiểm tra nhiều điều kiện khác nhau một cách tuần tự. PHP sẽ lần lượt kiểm tra từ điều kiện đầu tiên trong if
, sau đó đến elseif
thứ nhất, rồi elseif
thứ hai, và cứ thế tiếp tục. Ngay khi nó tìm thấy điều kiện đầu tiên đúng, nó sẽ thực thi khối mã tương ứng với điều kiện đó và bỏ qua tất cả các khối elseif
và else
còn lại. Nếu không có bất kỳ điều kiện nào trong if
hoặc các elseif
là đúng, thì khối else
(nếu bạn có định nghĩa) sẽ được thực thi như một lựa chọn "mặc định".
Ví dụ đời thường: Hãy hình dung việc xếp loại học sinh: "Nếu điểm giỏi thì khen thưởng; nếu không phải giỏi mà điểm khá thì tặng sách; nếu không thì khuyến khích cố gắng." Ở đây, có ba khả năng (giỏi, khá, không phải cả hai), và bạn kiểm tra theo thứ tự ưu tiên.
Cú pháp:
if (điều_kiện_1) { // Mã này sẽ chạy nếu điều_kiện_1 đúng } elseif (điều_kiện_2) { // Mã này sẽ chạy nếu điều_kiện_2 đúng (CHỈ KHI điều_kiện_1 SAI) } elseif (điều_kiện_N) { // Bạn có thể thêm nhiều khối 'elseif' ở đây // Mã này sẽ chạy nếu điều_kiện_N đúng (CHỈ KHI tất cả các điều kiện phía trước đều SAI) } else { // Mã này sẽ chạy nếu KHÔNG CÓ điều kiện nào ở trên đúng }
if (điều_kiện_1) { ... }
: Khối đầu tiên, được kiểm tra trước.elseif (điều_kiện_2) { ... }
: "Nếu điều kiện trước đó sai, THÌ kiểm tra điều kiện này." Bạn có thể có nhiềuelseif
liên tiếp.else { ... }
: Khối tùy chọn, sẽ được thực thi nếu tất cả các điều kiệnif
vàelseif
phía trên đều sai.
Ví dụ PHP đơn giản:
Xếp loại học lực (Giỏi, Khá, Trung bình, Yếu):
Giả sử các mức xếp loại như sau:
- Điểm từ 90 trở lên: Giỏi
- Điểm từ 70 đến dưới 90: Khá
- Điểm từ 50 đến dưới 70: Trung bình
- Điểm dưới 50: Yếu
<?php $diem = 82; // Điểm của học sinh A echo "Điểm của học sinh: " . $diem . "<br>"; if ($diem >= 90) { // Kiểm tra điều kiện 1: Điểm có >= 90 không? echo "Xếp loại: Giỏi"; } elseif ($diem >= 70) { // Nếu điều kiện 1 sai, kiểm tra điều kiện 2: Điểm có >= 70 không? echo "Xếp loại: Khá"; // Với $diem = 82, điều kiện này đúng, mã này sẽ chạy. } elseif ($diem >= 50) { // Nếu điều kiện 2 sai, kiểm tra điều kiện 3: Điểm có >= 50 không? echo "Xếp loại: Trung bình"; } else { // Nếu tất cả các điều kiện trên đều sai echo "Xếp loại: Yếu"; } echo "<br>---<br>"; $diemKhac = 45; // Điểm của học sinh B echo "Điểm của học sinh: " . $diemKhac . "<br>"; if ($diemKhac >= 90) { // 45 >= 90 -> Sai echo "Xếp loại: Giỏi"; } elseif ($diemKhac >= 70) { // 45 >= 70 -> Sai echo "Xếp loại: Khá"; } elseif ($diemKhac >= 50) { // 45 >= 50 -> Sai echo "Xếp loại: Trung bình"; } else { // Tất cả điều kiện trên đều sai, chạy khối else này echo "Xếp loại: Yếu"; // Với $diemKhac = 45, mã này sẽ chạy. } ?>
Giải thích:
Với $diem = 82
:
82 >= 90
là sai.- PHP chuyển sang
elseif ($diem >= 70)
.82 >= 70
là đúng. Do đó, "Xếp loại: Khá" được in ra, và các khốielseif
vàelse
còn lại bị bỏ qua.
Với $diemKhac = 45
:
45 >= 90
là sai.45 >= 70
là sai.45 >= 50
là sai.- Vì không có điều kiện nào đúng, khối
else
được thực thi, in ra "Xếp loại: Yếu".
Hiển thị thông báo thời tiết (Nóng, Ấm, Lạnh):
Giả sử các mức nhiệt độ:
- Nhiệt độ trên 30°C: Nóng
- Nhiệt độ từ 15°C đến 30°C (bao gồm cả 15 và 30): Ấm áp
- Nhiệt độ dưới 15°C: Lạnh
<?php $nhietDo = 22; // Nhiệt độ hiện tại echo "Nhiệt độ hiện tại: " . $nhietDo . "°C<br>"; if ($nhietDo > 30) { // Kiểm tra điều kiện 1: Nhiệt độ có > 30 không? echo "Thời tiết: Nóng!"; } elseif ($nhietDo >= 15 && $nhietDo <= 30) { // Nếu điều kiện 1 sai, kiểm tra: Nhiệt độ từ 15 đến 30? echo "Thời tiết: Ấm áp."; // Với $nhietDo = 22, điều kiện này đúng, mã này sẽ chạy. } else { // Nếu cả hai điều kiện trên đều sai echo "Thời tiết: Lạnh!"; } echo "<br>---<br>"; $nhietDoKhac = 8; // Một nhiệt độ khác echo "Nhiệt độ hiện tại: " . $nhietDoKhac . "°C<br>"; if ($nhietDoKhac > 30) { // 8 > 30 -> Sai echo "Thời tiết: Nóng!"; } elseif ($nhietDoKhac >= 15 && $nhietDoKhac <= 30) { // (8 >= 15 && 8 <= 30) -> (Sai && Đúng) -> Sai echo "Thời tiết: Ấm áp."; } else { // Cả hai điều kiện trên đều sai, chạy khối else này echo "Thời tiết: Lạnh!"; // Với $nhietDoKhac = 8, mã này sẽ chạy. } ?>
Giải thích:
Với $nhietDo = 22
:
22 > 30
là sai.- PHP chuyển sang
elseif ($nhietDo >= 15 && $nhietDo <= 30)
. Cả hai phần của điều kiện này đều đúng (22 >= 15
là đúng và22 <= 30
là đúng), nên toàn bộ điều kiện là đúng. Do đó, "Thời tiết: Ấm áp." được in ra.
Với $nhietDoKhac = 8
:
8 > 30
là sai.- PHP chuyển sang
elseif ($nhietDoKhac >= 15 && $nhietDoKhac <= 30)
. Phần8 >= 15
là sai, nên toàn bộ điều kiện&&
là sai. - Vì không có điều kiện nào đúng, khối
else
được thực thi, in ra "Thời tiết: Lạnh!".
Điều kiện được tạo ra như thế nào?
Để xây dựng các "điều kiện" trong dấu ngoặc đơn của if
, elseif
, chúng ta cần các công cụ đặc biệt:
Toán tử so sánh:
Dùng để so sánh hai giá trị và trả về true
hoặc false
.
Ví dụ:
==
(bằng giá trị):$a == 5
===
(giống hệt, cả giá trị và kiểu):$b === "hello"
>
(lớn hơn):$score > 100
<
(nhỏ hơn):$items < 5
>=
(lớn hơn hoặc bằng):$age >= 18
<=
(nhỏ hơn hoặc bằng):$price <= 50
!=
hoặc<>
(không bằng giá trị):$status != "error"
!==
(không giống hệt):$value !== 0
Toán tử logic:
- Dùng để kết hợp nhiều điều kiện (
true
/false
) lại với nhau, tạo thành một điều kiện phức tạp hơn. - Ví dụ:
&&
(AND - "Và"): Cả hai điều kiện con đều phải đúng. Ví dụ:($tuoi >= 18 && $coVe)
||
(OR - "Hoặc"): Chỉ cần một trong các điều kiện con là đúng. Ví dụ:($laAdmin || $laEditor)
!
(NOT - "Không"): Đảo ngược giá trị logic của một điều kiện. Ví dụ:(!$daDangNhap)
(nếu chưa đăng nhập)
Dấu ngoặc đơn ()
:
- Giống như trong toán học, dấu ngoặc đơn dùng để nhóm các điều kiện và kiểm soát thứ tự ưu tiên khi đánh giá.
- Ví dụ:
($diem > 8 && $chuyenCan == "Tot") || $laHocSinhGioiQuocGia
(Ở đây, phép&&
được đánh giá trước nhờ ngoặc đơn, sau đó mới đến||
).
Kết bài
Như vậy, chúng ta đã cùng nhau khám phá ba cấu trúc rẽ nhánh cốt lõi trong PHP: if
, else
, và elseif
. Bạn đã thấy cách những câu lệnh này biến chương trình của bạn từ một "cỗ máy" chạy thẳng thành một hệ thống có khả năng "ra quyết định" và phản ứng linh hoạt với các tình huống khác nhau. Từ việc thực hiện một hành động đơn lẻ khi điều kiện đúng với if
, đến việc chọn giữa hai con đường với if...else
, và thậm chí là xử lý nhiều lựa chọn phức tạp với if...elseif...else
.
Hãy nhớ rằng, sức mạnh của các cấu trúc rẽ nhánh này nằm ở điều kiện bạn cung cấp cho chúng. Chính các toán tử so sánh giúp bạn đặt ra những "câu hỏi" cụ thể về giá trị, và các toán tử logic cho phép bạn kết hợp những câu hỏi đó thành các biểu thức phức tạp, tinh vi hơn.
Việc nắm vững cách sử dụng các cấu trúc rẽ nhánh này không chỉ giúp bạn giải quyết các vấn đề hiện tại mà còn mở ra vô vàn khả năng để xây dựng những ứng dụng PHP mạnh mẽ và thông minh hơn.