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]
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ệnhif
.
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.
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 if
và else
. 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úcif...else
hoặcif...elseif...else
. Bạn có thể đặt nó ở cuối cùng, tuy nhiên bạn không thể đặt nó trướcelseif
. Tương tự, bạn không thể đặt lệnhelseif
trước lệnhif
.
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ệnhcase
. Thay vào đó, code xử lý của mỗicase
sẽ bắt đầu bằng đầu bằng dấu 2 chấm và kết thúc bằng lệnhbreak
. Tuy nhiên là, toàn bộ cáccase
củaswitch
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à News
thì 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 print
và echo
, 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ử.