Hướng dẫn dùng loop case trong PHP

Conditionals

Conditionals sẽ điều khiển flow của program. Chúng cho phép hỏi, đặt ra các điều kiện và phản hồi lại với mỗi điều kiện, qua đó giúp điều khiển program xử lý theo ý muốn. Mục tiêu cốt lõi của Conditionals là giúp tạo ra các dynamic web pages, vì ta có thể điều khiển, thiết lập các ouput khác nhau ứng với mỗi điều kiện, mỗi khi page được xem.
Tôi sẽ trình bày 3 conditional cơ bản trong phần này: đó là, câu lệnh if, lệnh switch, và toán tử ?. Ngoài ra, chúng ta cũng sẽ tìm hiểu về looping conditionals, cái giúp ta thực hiện lặp đi lặp lại đoạn code cho tới khi đáp ứng được điều kiện.

Nội dung chính

  • Conditionals
  • The if Statement
  • The else Statement
  • The elseif Statement
  • The switch Statement
  • The ? Operator
  • while Loops
  • do...while Loops
  • Breaking Out of a Loop
  • The continue Statement
  • Implicit and Explicit Casting
  • PHP Dynamic Linking
  • Dynamic Linking in Action

The if Statement

Có một cách hiểu đơn giản về program flow, đó là bạn hãy tưởng tượng bạn đang lái xe trên một đường cao tốc một chiều, và đường cao tốc này hầu như là thẳng tắp. Tuy nhiên, đôi khi bạn gặp các biển báo, báo hiệu cho biết bạn phải đi đâu. Trong trường hợp của lệnh if, bạn hãy tưởng tượng rằng, bạn gặp phải một biển báo hiệu đường vòng, và bạn phải đi theo biển báo này nếu điều kiện nào đó là Đúng. Trong trường hợp này, bạn cần lái xe đi theo đường vòng này cho tới khi đi đến đường chính, rồi tiếp tục đi theo hướng bạn đầu của bạn. Ngược lại, nếu điều kiện này là Không Đúng, bạn sẽ bỏ qua biển báo đường vòng này, và cứ tiếp tục chạy theo hướng ban đầu bạn đã định. [Tham khảo hình dưới đây]

Nội dung của điều if có thể là bất kỳ biểu thức PHP hợp lệ nào, bao gồm: kiểm tra, so sánh bằng, kiểm tra giá trị là 0 hay NULL, thậm chí chứa các function.
Nội dung thực hiện của hàm if sẽ được đặt trong dấu ngoặc kép {}. Và bạn có thể không cần dấu ngoặc nhọn {} nếu như hàm if chỉ thực thi một câu lệnh duy nhất. Nhưng theo kinh nghiệm của tôi, chúng ta nên luôn luôn dùng dấu ngoặc nhọn cho hàm if, để tránh các lỗi tiềm năng, ví dụ như một lúc nào đó bạn cần thêm một dòng xử lý cho hàm if, nếu thiếu dấu ngoặc nhọn, nó sẽ phát sinh bug và làm ta rất mất thời gian để điều tra.

Tips: Có một lỗ hổng bảo mật cực kỳ nổi tiếng được gọi là "goto fail", đã ảnh hưởng nghiêm trọng tới Secure Sockets Layer [SSL] tồn tại trong các sản phẩm của Apple trong nhiều năm, bời vì một programmer đã quên mất dấu ngoặc nhọn {} bao quanh lệnh if, lỗi này khiến cho một function đôi khi trả về trạng thái connect thành công, trong khi thực tế nó không phải như vậy. Điều này cho phép kẻ tấn công có được chứng chỉ bảo mật được chấp nhận, trong khi đáng lẽ ra nó phải bị từ chối. Tóm lại, nếu nghi ngờ có bug phát sinh, bạn nên đặt dấu ngoặc nhọn trong lệnh if.

Tuy nhiên, để cho ngắn gọn, trong loạt bài này, tôi sẽ bỏ qua các dấu ngoặc nhọn cho các câu lệnh đơn.
Trong ví dụ dưới đây, ta có ví dụ rằng, giả sử hiện tại đã đến cuối tháng, và bạn đã thanh toán tất cả các hóa đơn cần thiết, sau đó bạn sẽ thực hiện maintain tài khoản ngân hàng của bạn.


Trong ví dụ này, ta đã thực hiện hiện kiểm tra xem số dư [bankbala nce]trongtaˋikhoảncoˊnhỏhơn100bank_balance] trong tài khoản có nhỏ hơn 100 hay không. Nếu có, ta sẽ nạp thêm 1000$. Nếu số dư > 100$, thì câu lệnh điều kiện if sẽ không được thực hiện, và program flow sẽ nhảy qua line tiếp theo.
Trong các bài hướng dẫn này, tôi thường đặt dấu ngoặc nhọn trên một dòng mới. Tuy nhiên, một số người lại thích đặt dấu ngoặc nhọn đầu tiên ngay bên phải của biểu thực điều kiện. Nói chung một trong hai cách này đều tốt, vì PHP cho phép ta thiết lập các ký tự khoảng trắng theo bất kỳ cách nào bạn muốn [ví dụ, dấu cách, newline, tab ...]. Tuy nhiên, kinh nghiệm của tôi cho thấy rằng, code của bạn sẽ dễ đọc và debug hơn nếu bạn thụt đầu dòng trên dòng mới với 1 tab.

The else Statement

Đôi khi một điều kiện không phải là TRUE, và bạn không muốn nó tiếp tục thực hiện theo luồng chương trình chính mà muốn nó thực hiện một điều khác, thì đây chính là lúc chúng ta dùng đến lệnh else. Với lệnh else này bạn có thể thiết lập program đi theo con đường vòng thứ 2, như trong hình dưới đây.

Với biểu thức if ... else, câu lệnh đầu tiên sẽ được thực hiện nếu điều kiện là TRUE. Ngược lại, nếu điều kiện là FALSE thì câu lệnh thứ 2 sẽ được thực thi. Tóm lại là một trong 2 lựa chọn sẽ được thực hiện. Không có trường hợp nào mà cả 2 lựa chọn đều được thực thi, hoặc đều không được thực thi. Bạn có thể xem ví dụ về cấu trúc if ... else dưới đây:


Trong ví dụ này, nếu bạn có >= 100$ trong tài khoản ngân hàng, thì câu lệnh else sẽ được thực thi, và sẽ thực hiện tiết kiệm một khoản tiền là 50$.
Cũng giống như lệnh if, nếu else chỉ có một câu lệnh đơn, thì bạn có thể không cần thêm vào dấu ngoặc kép. [Tuy nhiên, như lời khuyên bên trên, bạn nên thêm vào dấu ngoặc kép. Thứ nhất, nó giúp code của bạn dễ đọc hơn. Thứ hai là bạn có thể dễ dàng bổ sung thêm nhiều logic trong tương lai]

The elseif Statement

Đôi khi bạn muốn xét tới các khả năng khác nhau xảy ra dựa trên chuỗi các điều kiện khác nhau. Bạn có thể thực hiện điều này bằng cách sử dụng câu lệnh elseif. Nó cũng tương tự như lệnh else, tuy nhiện bạn cần bổ sung thêm điều kiện cho nó. Dưới đây là cấu trúc if...elseif...else


Trong ví dụ trên, lệnh elseif đã được chèn vào giữa lệnh ifelse. Nó kiểm tra xem tài khoản ngân hàng của bạn có lớn hơn 200$ hay không? Nếu có, thì sẽ thực hiện tiết kiệm 100$ trong tháng này.
Bạn có thể tưởng tượng về cấu trúc này là nó bao gồm nhiều con đường rẽ khác nhau.

Tips: Câu lệnh else là câu lệnh đóng của cấu trúc if...else hoặc if...elseif...else. Bạn có thể đặt nó ở cuối cùng, tuy nhiên bạn không thể đặt nó trước elseif. Tương tự, bạn không thể đặt lệnh elseif trước lệnh if.

Bạn có thể đặt bao nhiêu lệnh elseif tùy ý muốn. Tuy nhiên, nếu số lượng lệnh elseif tăng lên đáng kể, bạn nên sử dụng một dụng câu lệnh switch mà tôi sẽ giới thiệu dưới đây.

The switch Statement

Câu lệnh switch sẽ rất hữu ích trong trường hợp một biến hay kết quả của biểu thức có nhiều giá trị khác nhau, và với mỗi giá trị đó sẽ thực thi một hành động khác nhau.
Dưới đây, ta có một ví dụ về PHP-driven menu, chức năng này thực hiện chuyển đổi một single string thành các option main menu theo những gì user đã yêu cầu. Ta có các option menu là Home, About, News, Login, và Links, và ta sẽ đặt một biến $page để lưu lựa chọn của user.
Nếu viết theo cấu trúc if...elseif...else, ví dụ của chúng ta sẽ trông như sau:


Và khi chuyển sang dùng switch, ví dụ của chúng ta sẽ trở nên như sau:


Như bạn thấy ở trên, biến $page chỉ cần viết một lần ở đầu câu lệnh switch. Sau đó, lệnh case sẽ kiểm tra các kết quả phù hợp, khi một điều kiện thỏa mãn thì câu lệnh tương ứng sẽ được thực thi. Đây chỉ là một ví dụ đơn giản, trong ứng dụng thực tế ta sẽ có code xử lý để user thực hiện chuyển sang page tương ứng, hoặc xử lý các logic phức tạp hơn.

Tips: Với lệnh switch, thì ta sẽ không sử dụng dấu ngoặc kép bên trong lệnh case. Thay vào đó, code xử lý của mỗi case sẽ bắt đầu bằng đầu bằng dấu 2 chấm và kết thúc bằng lệnh break. Tuy nhiên là, toàn bộ các case của switch sẽ được bao quanh bởi dấu ngoặc nhọn.

Breaking out

Nếu bạn muốn thoát khỏi switch bời vì một điều kiện đã được thỏa mãn thì hãy sử dùng lệnh break. Câu lệnh này sẽ yêu cầu PHP thoát khỏi switch và nhảy tới lệnh tiếp theo của program.
Ở ví dụ trên, giả sử nếu bạn không dùng lệnh switch và case của Home là TRUE, thì tất cả 5 case này đều được thực thi. Tương tự, giả sử nếu $page có giá trị là Newsthì tất cả các case từ News trở đi đều được thực thi. Việc này là do xử lý có chủ đích của PHP nhằm phục vụ cho một số kỹ năng lập trình nâng cao. Về cơ bản, bạn cần luôn luôn nhớ là phải dụng lệnh break mỗi khi điều kiện case được thực thi xong. Trên thực tế, việc quên lệnh break là một lỗi khá phổ biến của các lập trình viên.

Default action

Một yêu cầu cơ bản nữa trong switch đó là nhảy vào lệnh default actionn trong trường hợp không có case nào thỏa mãn điều kiện. Trong ví dụ về menu code bên trên, bạn có thể thêm xử lý default vào ngay trước dấu ngoặc nhọn cuối cùng.

default:
    echo "Unrecognized selection";
    break;

Thực ra cái này nó cũng tương tự với else trong cấu trúc if ... else bên trên.
Chú ý rằng, lệnh break của default là không bắt buộc, bời vì lệnh default đã là lệnh con cuối cùng rồi, và program sẽ tự động chạy tới dấu ngoặc nhọn đóng. Tuy nhiên, nếu bạn đặt lệnh default ở mức cao hơn, thì chắc chắn ta cần lệnh break để ngăn chặn program chạy tiếp đến case tiếp theo. Tóm lại, cách thực hiện an toàn nhất là luôn bao gồm lệnh break.

Alternative syntax

Nếu muốn, bạn có thể thay thế dấu ngoặc nhọn đầu tiên trong switch bằng dấu 2 chấm :, và dấu ngoặc nhọn cuối cùng bằng lệnh endswitch. Tuy nhiên, đây là cách viết không phổ biến, tôi để cập ở đây chỉ muốn bạn biết về sự tồn tại của chúng.


The ? Operator

Có một cách để không phải viết cấu trúc if ... else dài dòng đó là sử dụng toán tử 3 ngôi ?, khi dùng toán tử này ta cần đến 3 toán hạng, thay vì chỉ viết 2 toán hạng như thông thường.
Ở các bài viết trước, ta đã tìm hiểu về sự khác biệt giữa lệnh printecho, có những trường hợp nó hoạt động tốt với print nhưng lại không tốt với echo.
Toán tử ? được dùng trong biểu thức đánh giá, với 2 trạng thái sẽ được thực thi: một là khi biểu thức có giá trị TRUE, cái còn lại là khi biểu thức có giá trị FALSE. Dưới đây ta sẽ áp dụng toán tử này để viết một ví dụ về cảnh báo mức nhiên liệu của ô tô hiển thị trên bảng điện tử.

Chủ Đề