Cấu trúc điều khiển (Control Structures) là cách để chỉ định luồng điều khiển trong chương trình. Bất kỳ thuật toán hoặc chương trình nào cũng có thể rõ ràng và dễ hiểu hơn nếu chúng sử dụng các mô-đun độc lập được gọi là cấu trúc logic hoặc điều khiển.
Về cơ bản, nó phân tích và chọn hướng mà luồng chương trình chảy dựa trên các tham số hoặc điều kiện nhất định. Có ba loại logic cơ bản hoặc luồng điều khiển, được gọi là:
- Logic tuần tự hoặc luồng tuần tự
- Logic lựa chọn hoặc luồng có điều kiện
- Logic lặp lại hoặc luồng lặp lại
Điều kiện if
Cú pháp như sau:
Đọc bài, bạn cần nhận ra sự sai sót của người viết, có như vậy thì mới chứng tỏ bạn nắm rõ bài. Ở đoạn mã trên, chúng tôi đã quên kết thúc câu lệnh var_dump (dòng 18) bằng dấu chấm phẩy, khi thực hành, bạn tự thêm vào.
Diễn tả bằng lời, từ khóa if rồi đến dấu ngoặc tròn, có thể dính với if hoặc cách một khoảng trắng cho dễ đọc, bên trong cặp ngoặc tròn (parentheses) mở – đóng là mệnh đề điều kiện/ phép so sánh/ lập luận logic. Sau cặp ngoặc tròn có dấu cặp dấu sừng trâu (curly brackets) mở – đóng, bên trong cặp dấu sừng trâu này sẽ là những statement.
Dấu sừng trâu có thể nằm cùng dòng hoặc khác dòng với mở đầu phát biểu if. Một số phong cách viết mã, người ta cho dấu sừng trâu nằm khác dòng và dấu mở, dấu đóng có độ thụt dòng bằng nhau để dễ đọc mã.
Nếu chỉ có một statement duy nhất, bạn có thể lược bỏ cặp dấu sừng trâu đi. Nhưng nếu viết mã cho dễ đọc, bạn nên có cặp dấu sừng trâu.
Diễn giải ra sao? Dòng 11 nếu y lớn hơn y thì dòng 12 in ra y lớn hơn y. Điều này thấy vô lý và bậy bạ vô cùng, xin mời bạn sửa 1 trong 2 chữ y thành chữ x nhé. Chúng tôi thường cố tinh gây lỗi trong bài viết để các bạn khi học cần phải có sự động não, đọc mà làm theo như vẹt là không được, hỏng bét.
Khối if còn lại là nếu i lớn hơn hoặc bằng j thì in ra i lớn hơn hoặc bằng j. Ui chao, gì mà lạ kỳ vậy, trông chẳng thơ mộng gì, bạn hãy tự biến câu in ra thành cái gì đó thơ mộng hơn. Còn lệnh var_dump ($i) là để hiển thị thêm các thông tin về một biến, ở đây là biến i.
Diễn tả bằng lời để bạn dễ hiểu hơn: nếu a lớn hơn b thì in ra dòng chữ a lớn hơn b, còn không (nghĩa là a bằng b hoặc a nhỏ hơn b, thì in ra dòng chữ a không lớn hơn b.
a, b ở đây là các biến đã được khai báo trước đó và có thể tính toán được giá trị. Trường hợp a, b chưa tồn tại, trình biên dịch sẽ báo lỗi bởi vì không thể so sánh được 2 biến chưa được định nghĩa.
Ngoài cách sử dụng biến, bạn cũng có thể sử dụng giá trị cụ thể, nhưng thực tế, khi nhìn vào con số, chuỗi, bạn đã biết chúng có mối quan hệ như thế nào với nhau nên phép so sánh trong mệnh đề if sẽ thừa thãi. Tuy nhiên, vẫn có vài trường hợp trong thực bạn có thể dùng đến.
Đây là cấu trúc mà nếu so sánh đầu tiên có giá trị là false, sẽ rẽ vào nhánh elseif để xét tiếp điều kiện, nếu true sẽ thực hiện, nếu false sẽ nhảy vào khối else cuối cùng.
Việc viết elseif trong PHP bạn có thể viết rời thành else if đêu cho kết quả giống nhau.
Cấu trúc if còn có một biến thể khác sử dụng dấu hai chấm thay vì khối mã trong dấu sừng trâu, trông như sau:
Cấu trúc này rất phù hợp để sử dụng trong trường hợp bạn dùng trộn giữa PHP và HTML hoặc dùng với một template engine nào đó có hỗ trợ cú pháp PHP template engine. Nghĩa là ở giữa mở đầu và kết thúc khối if bạn có thể dùng mã PHP hoặc HTML (như ở hình minh họa trên). Nếu dùng PHP thì bạn nhớ có phần mở và đóng PHP như bình thường.
Chú ý : elseif có thể viết thành else if khi sử dụng cấu trúc if dùng với dấu sừng trâu, còn cấu trúc viết với dấu hai chấm bạn cần viết elseif, nếu không PHP sẽ phiên dịch sai.
While (trong khi)
Xem qua ví dụ:
Diễn giải: trong khi (chừng nào) biến i còn nhỏ hơn hoặc bằng 10 thì in ra i cộng thêm một. Kết quả chạy vòng lặp này bạn sẽ thấy 12345678910. Vòng lặp sẽ dừng khi i đạt đến 10. Ta hiểu rằng vòng lặp sẽ còn thực hiện mãi cho đén khi điều kiện vẫn true và dừng ngay khi điều kiện false.
Nếu viết while theo cấu trúc dùng dấu hai chấm, sẽ như sau:
Dùng while khi bạn không biết đích xác khi nào dừng nhưng biết được điều kiện dừng sẽ xảy ra. Dĩ nhiên, nếu bạn tính toán bằng tay bạn có thể biết được lúc nào xảy ra dừng vòng lặp, nhưng bản chất vấn đề so với vòng lặp for đó là dùng while bạn không có mốc rõ ràng, còn for là bạn có điểm đầu, điểm cuối.
Cẩn thận với vòng lặp while khi điều kiện dừng. Hầu hết những người học lập trình thuở ban đầu ở các ngôn ngữ khác nhau đều vướng phải việc lặp vô tận với vòng lặp while hoặc tương đương vì điều kiện dừng vòng lặp đã không xảy ra.
Bài thực hành
- Khai báo biến $tho và biến $cho và gán cho mỗi biến một giá trị nguyên, giả sử tương ứng với cân nặng của con thỏ, con chó và thử làm một mệnh đề so sánh với if, in ra con nào nặng hơn con nào.
- Tìm và thực hành các ví dụ của hai cấu trúc dạng sừng trâu và dạng hai chấm để hiểu hơn về chúng và nên dùng trường hợp nào, cũng rõ để tránh trộn lẫn với nhau khiến cho mã khó đọc hoặc do sự rối rắm trong lập luận logic gây ra lỗi khó gỡ.