if (condition) { ... } chỉ chạy khối lệnh của nó khi điều kiện là true. Thêm elseif (other condition) { ... } cho các trường hợp khác và else { ... } cho mọi trường hợp còn lại. PHP kiểm tra các điều kiện từ trên xuống và chỉ chạy khối đầu tiên khớp.
Đổi giá trị $temperature rồi chạy lại. Vì các phép kiểm tra đi từ trên xuống dưới, 24 dừng ở điều kiện thứ hai và không bao giờ tới >= 10, dù điều kiện đó cũng đúng. Hãy sắp xếp điều kiện từ cụ thể nhất đến chung nhất.
elseif và else if
Khi dùng dấu ngoặc nhọn, elseif và else if làm cùng một việc. Về mặt kỹ thuật, else if là một else mà phần thân là một if mới, nhưng kết quả hoàn toàn giống nhau.
Khác biệt chỉ xuất hiện với cú pháp dấu hai chấm dùng trong template (các phần sau). Ở đó, else if làm hỏng code:
<?php $score = 72; ?>
<?php if ($score >= 90): ?>
<p>A</p>
<?php else if ($score >= 60): ?>
<p>Passed</p>
<?php endif; ?>
PHP Parse error: syntax error, unexpected token "if", expecting ":" in /home/index.php on line 4
Viết elseif liền thành một từ là bạn sẽ không bao giờ gặp lỗi đó.
Nhiều điều kiện với && và ||
&& (và) cần cả hai vế đều true, || (hoặc) cần ít nhất một vế, còn ! đảo ngược điều kiện. PHP ngừng tính toán ngay khi đã biết kết quả, nên trong $user !== null && $user['active'] vế thứ hai chỉ chạy khi có người dùng.
Khi kết hợp && và ||, hãy thêm dấu ngoặc đơn: && có độ ưu tiên cao hơn, và dấu ngoặc giúp người đọc sau hiểu ngay ý bạn. PHP cũng có từ khóa and và or, nhưng chúng có độ ưu tiên thấp hơn =, nên $ok = true and false; gán $ok thành true. Cứ dùng && và ||.
Giá trị nào được coi là true trong if
Điều kiện không nhất thiết phải là boolean. PHP tự chuyển đổi, và chỉ một số ít giá trị được coi là false: false, 0, 0.0, "", "0", [] và null. Mọi giá trị khác đều là true, kể cả "false", " " và "0.0".
| $x | bool | empty |
|---|---|---|
| false | ||
| 0 | ||
| 0.0 | ||
| "" | ||
| "0" | ||
| null | ||
| [] | ||
| " " | ||
| "0.0" | ||
| "a" | ||
| [0] | ||
| 1 |
Đó là lý do if ($items) là cách viết phổ biến để nói "mảng không rỗng". Hàng "0" là chỗ hay gây lỗi: một trường form mà ai đó gõ 0 là chuỗi không rỗng, vậy mà if ($_POST['qty']) lại coi nó là false. Hãy so sánh tường minh (if ($qty !== '')) khi số 0 là một câu trả lời hợp lệ. Cũng chính các quy tắc này quyết định empty() trả về gì.
if else trong HTML với if: và endif;
Giữa các thẻ HTML, dấu ngoặc nhọn rất dễ bị lạc. PHP có cú pháp thay thế: dấu hai chấm sau điều kiện, elseif ...: và else: cho các nhánh khác, và endif; ở cuối. Chạy khối này, rồi bấm vào các điểm số trong tab Trang: mỗi liên kết chạy lại cùng script với một $_GET['score'] mới.
<?= $score ?> là cách viết tắt của <?php echo $score; ?>. Kiểu dấu hai chấm này cũng có cho vòng lặp (foreach: endforeach;, while: endwhile;) và được phần lớn template PHP sử dụng.
If một dòng và toán tử ba ngôi
Một câu lệnh duy nhất có thể đi ngay sau điều kiện mà không cần dấu ngoặc nhọn. Cách này chạy được, nhưng dòng tiếp theo bạn thêm vào sẽ không nằm trong if, nên nhiều quy ước code yêu cầu luôn có dấu ngoặc nhọn. Để chọn một trong hai giá trị, toán tử ba ngôi ngắn gọn hơn một khối if/else đầy đủ.
Khi cần so sánh một biến với nhiều giá trị cụ thể, biểu thức match dễ đọc hơn một chuỗi elseif dài.
Return sớm thay vì lồng nhau
Các khối if lồng nhau nhiều tầng rất khó theo dõi. Bên trong một hàm, hãy kiểm tra các trường hợp lỗi trước và return ngay. Logic chính khi đó nằm sát lề trái.
Lỗi thường gặp: dùng = thay cho == trong điều kiện
Một dấu = là phép gán. if ($role = 'admin') lưu 'admin' vào $role rồi kiểm tra chuỗi đó, vốn là true. Khối lệnh chạy với mọi người dùng, và $role giờ cũng sai luôn.
Dùng === để so sánh, trừ khi bạn thật sự cần ép kiểu tự động (type juggling). Một số người viết hằng số trước (if ('admin' === $role)), để khi thiếu một dấu = thì PHP báo lỗi thay vì âm thầm gán giá trị.
Câu hỏi thường gặp
elseif và else if trong PHP khác nhau thế nào?
Khi dùng dấu ngoặc nhọn, hai cách viết hoạt động như nhau: else if là một else mà phần thân là một if khác. Với cú pháp dấu hai chấm (if (...): ... endif;) chỉ elseif dùng được, còn else if gây lỗi parse. Viết elseif ở mọi nơi là tránh được khác biệt này.
Làm sao kiểm tra nhiều điều kiện trong câu lệnh if của PHP?
Nối chúng bằng && (tất cả đều phải true) hoặc || (ít nhất một cái true): if ($age >= 18 && $hasTicket) { ... }. Thêm dấu ngoặc đơn khi bạn kết hợp cả hai, ví dụ if ($isAdmin || ($isOwner && $isActive)).
Làm sao viết câu lệnh if trên một dòng trong PHP?
Một câu lệnh duy nhất có thể đi ngay sau điều kiện mà không cần dấu ngoặc nhọn: if ($debug) echo 'debug mode';. Để chọn giữa hai giá trị trên một dòng, dùng toán tử ba ngôi: $label = $count === 1 ? 'item' : 'items';.
Làm sao dùng if else bên trong HTML với PHP?
Dùng cú pháp thay thế, rất dễ đọc khi nằm giữa các thẻ HTML: <?php if ($loggedIn): ?> <p>Welcome back</p> <?php else: ?> <a href="/login">Log in</a> <?php endif; ?>.