IV. Các cú pháp điều khiển cơ bản
2. Lệnh rẽ nhánh
Tương tự JavaScript, PHP cũng có hai dạng rẽ nhánh cơ bản là rẽ nhánh if (thường được dùng cho các trường hợp rẽ hai nhánh) và rẽ nhánh switch (thường được dùng trong trường hợp cần rẽ nhiều nhánh).
a. Lệnh rẽ nhánh if
Cú pháp của lệnh rẽ nhánh if như sau: if (điều_kiện)
khối_câu_lệnh
Điều kiện ở đây có thể là một điều kiện, hoặc nhiều điều kiện kết hợp với nhau bởi các toán tử logic (and, or hoặc not).
Khối câu lệnh có thể bao gồm một hoặc nhiều câu lệnh khác nhau. Trong trường hợp chỉ có duy nhất một câu lệnh, chúng ta có thể không cần đưa chúng vào cặp dấu ngoặc nhọn đánh dấu khối, ngược lại, chúng ta phải đưa toàn bộ khối câu lệnh vào cặp dấu ngoặc nhọn ({}) để xác định khối câu lệnh cần xử lý.
Ví dụ: if (1<3) echo (“1 nhỏ hơn 3”); if (1<3 and 2<3) { echo (“1 nhỏ hơn 3); echo (“Và 2 cũng nhỏ hơn 3”); }
Chú ý rằng với lệnh if, chúng ta không đưa dấu chấm phẩy (;) ngay sau dấu ngoặc đóng của lệnh (if (điều_kiện);). Nếu ta đưa dấu chấm phẩy vào vị trí này, chương trình coi như chúng ta đã kết thúc câu lệnh if và thực thi câu lệnh ngay phía sau đó:
// Lệnh if sau đây sẽ vẫn hiển thị dòng chữ “4 nhỏ hơn 3! Vô lý quá” If (4<3);
echo (“4 nhỏ hơn 3! Vô lý quá”);
// Lệnh if sau đây sẽ không hiển thị dòng chữ “4 nhỏ hơn 3! Quá vô lý” if (4<3)
echo (“4 nhỏ hơn 3! Quá vô lý”);
Với câu lệnh if ở trên, chúng ta mới chỉ xác định được rằng nếu như điều kiện điều_kiện
đúng thì sẽ thực hiện một công việc nào đó. Trong trường hợp điều kiện sai, chúng ta có thể tận dụng chúng để chuyển hướng sang các khối câu lệnh khác. Để làm điều này, ta sử dụng cú pháp đầy đủ if ... else
Cú pháp đầy đủ của lệnh if như sau: if (điều_kiện)
khối_câu_lệnh_1 else
khối_câu_lệnh_2
Câu lệnh này có thể dịch ra như sau:
Nếu các điều kiện điều_kiện đúng thì thực hiện khối câu lệnh khối_câu_lệnh_1, còn nếu sai thì thực hiện khối câu lệnh khối_câu_lệnh_2
Ví dụ: $ThoiTiet=$_GET[“thoitiet”]; $HD1=”Đi du lịch Yên Tử”; $HD2=”Ở nhà”; if ($ThoiTiet ==”Mua”) {
echo (“Trời mưa -->”); echo ($HD2);
else {
echo (“Thời tiết đẹp -->”); echo ($HD1);
}
Trong trường hợp điều kiện sai, chúng ta có thể kết hợp câu lệnh if và câu lệnh else để đưa thêm các rẽ nhánh khác:
if ($a > $b) {
echo "a lớn hơn b"; } elseif ($a == $b) { echo "a bằng b"; } else {
echo "a nhỏ hơn b"; }
Ví dụ dưới đây thể hiện một chương trình giải bài toán ax=b, trong đó người sử dụng nhập a và b từ một form HTML và truyền về cho chương trình xử lý.
Nguyên tắc cơ bản như sau:
Bước 1: Hiển thị một mẫu biểu HTML để người dùng nhập 2 số a và b và kích chọn nút Gửi đi để xem kết quả
Bước 2: Nếu người dùng kích chọn nút Gửi đi, chương trình sẽ kiểm tra xem dữ liệu có hợp lệ hay không? Nếu có thì tính kết quả của x và hiển thị lên màn hình:
<form method="POST">
<p style="margin-top: 0; margin-bottom: 0">
Nhập a:<input type="text" name="a" size="20"></p>
<p style="margin-top: 0; margin-bottom: 0">Nhập b:<input type="text" name="b" size="20"></p> <p style="margin-top: 0; margin-bottom: 0">
<input type="submit" value="Tính" name="B1"></p> </form> <?php $a=0; $b=0; if (isset ($_POST["a"])) { $a =$_POST["a"]; } if (isset ($_POST["b"])) { $b =$_POST["b"]; } if ($a<>0) {
} else {
if ($b==0) {
echo "<BR>Vo so nghiem"; }
else {
echo "<BR>Vo nghiem"; }
} ?>
b. Lệnh rẽ nhánh switch
Đối với lệnh if, thông thường chúng ta chỉ rẽ hai nhánh. Để có thể yêu cầu chương trình rẽ được nhiều nhánh hơn, việc sử dụng các câu lệnh if, elseif... sẽ làm giảm tính minh bạch của chương trình. Thay vào đó, chúng ta nên chuyển sang sử dụng câu lệnh switch.
Cú pháp cơ bản của câu lệnh này như sau: switch (biến) { case giá_trị_1: Đoạn_lệnh_1; break; case giá_trị_2: Đoạn_lệnh_2; break; case giá_trị_n: Đoạn_lệnh_n; break; // Tùy chọn mặc định default: Đoạn_lệnh_mặc_định }
Cú pháp này có nghĩa như sau:
Trước tiên, chương trình sẽ kiểm tra biến biến xem nó đang nắm giữ giá trị nào.
Tiếp đó, tương ứng với giá trị mà biến đó đang nắm giữ, chương trình sẽ so sánh với các giá trị giá_trị_i trong từng trường hợp cụ thể case. Nếu như có câu lệnh case tương ứng với giá trị giá_trị_i, chương trình sẽ thực thi đoạn lệnh Đoạn_lệnh_i. Trong trường hợp không tìm thấy, và người dùng khai báo đoạn lệnh mặc định sau từ khóa default, đoạn lệnh mặc định này sẽ được triệu gọi.
Chú ý rằng sau mỗi đoạn lệnh Đoạn_lệnh_i, ta phải sử dụng câu lệnh break để ngăn không cho chương trình xử lý tiếp các đoạn lệnh còn lại của câu lệnh switch.
Ví dụ:
// Trường hợp này không có đoạn lệnh mặc định. switch ($i) { case 0: echo ("i bằng 0"); break; case 1: echo ("i bằng 1"); break; case 2: echo ("i bằng 2"); break; }
Một trường hợp rất hay được sử dụng trong các sản phẩm mã nguồn mở viết bằng PHP là việc ứng dụng lệnh switch để chuyển hướng điều khiển từ file index.php sang các file mã lệnh khác thông qua tham số action mà người dùng ấn định trên địa chỉ URL.
Thông thường, các bạn sẽ thấy trên địa chỉ trình duyệt có những chuỗi URL có dạng:
http://tenmien/index.php?action=xxx, trong đó xxx là một tham số xác định triệu gọi một module nào đó. Câu lệnh chuyển hướng sẽ có dạng sau:
$Action=$_GET[“action”]; switch ($Action)
{
case “th1”:
// Đoạn mã lệnh được triệu gọi khi gặp trường hợp th1; break;
case “th2”:
// Đoạn mã lệnh được triệu gọi khi gặp trường hợp th2; break; ... default // Đoạn mã lệnh được xử lý mặc định; } 3. Lệnh lặp
Cú pháp điều khiển cuối cùng mà chúng ta cần phải biết là các câu lệnh lặp. Có 3 dạng lệnh lặp cơ bản là lệnh lặp kiểm tra điều kiện trước không xác định số lần lặp, câu lệnh lặp kiểm tra điều kiện sau không xác định số lần lặp và câu lệnh lặp với số lần xác định trước.
a. Câu lệnh lặp kiểm tra điều kiện trước không xác định số lần lặp
Câu lệnh lặp kiểm tra điều kiện trước while được sử dụng để xác định một vòng lặp mà ta không thể dự kiến được số lần lặp. Câu lệnh lặp này sẽ chỉ dừng khi điều kiện xác định vòng lặp trả về giá trị sai (false).
Cú pháp của câu lệnh này như sau: while (điều_kiện)
Khối_câu_lệnh_cần_lặp
Trong đó, điều_kiện là một biểu thức điều kiện để xác định sự tồn tại của vòng lặp. Khi điều kiện này còn trả về giá trị đúng (true) thì vòng lặp sẽ còn tiếp tục hoạt động để thực thi khối_câu_lệnh_cần_lặp. Điều đó có nghĩa là trong khối câu lệnh cần lặp, chúng ta sẽ phải xác định các biến có liên quan đến biểu thức điều kiện để khi thỏa mãn một giá trị nào đó, vòng lặp sẽ được dừng lại. Nếu chúng ta không chú ý đến điều này sẽ dẫn đến tình trạng chương trình bị lặp vô hạn.
Ví dụ: $i=1;
While ($i<10) {
echo (“Giá trị của i là: ” . $i . “<BR>”); $i++;
}
b. Câu lệnh lặp kiểm tra điều kiện sau không xác định số lần lặp
Câu lệnh lặp kiểm tra điều kiện sau là dạng câu lênh lặp không xác định. Tương tự như cách thức kết thúc vòng lặp của câu lệnh lặp kiểm tra điều kiện trước, vòng lặp sẽ chỉ dừng khi điều kiện lặp xác định giá trị sai.
Sự khác nhau cơ bản giữa hai câu lệnh này là: Đối với câu lệnh lặp kiểm tra điều kiện trước, chương trình sẽ phải kiểm tra điều kiện trước khi thực hiện khối câu lệnh cần lặp, còn đối với câu lệnh lặp kiểm tra điều kiện sau, chương trình sẽ thực thi khối câu lệnh cần lặp ít nhất một lần trước khi kiểm tra điều kiện dừng.
Cú pháp của câu lệnh này như sau: do
{
Khối câu lệnh cần lặp }
while (điều_kiện)
Ví dụ sau đây sử dụng vòng lặp do...while: $i = 0;
do { echo $i; } while ($i>0);
ví dụ trên, vòng lặp luôn in ra giá trị $i(=0) trước khi kiểm tra điều kiện $i>0.
c. Câu lệnh lặp với số lần xác định trước (for)
Trong phần lớn các ngôn ngữ lập trình, câu lệnh lặp với số lần xác định trước (lệnh for) là một câu lệnh đơn giản. Tuy nhiên, để tăng tính linh động cho câu lệnh này, PHP đã biến tướng nó thành một cấu trúc hơi rắc rối một chút.
Cú pháp của câu lệnh này như sau: For (biểu thức 1; biểu thức 2;biểu thức 3)
Khối lệnh cần thực hiện
Một dạng thức của lệnh for mà chúng ta thường gặp trong các ngôn ngữ lập trình được thể hiện như sau:
for ( $biến = giá_trị_đầu; $biến < (hay <=) giá_trị_kết_thúc; tăng_biến_đếm) //Khối câu lệnh
Với dạng thức trên, đầu tiên chương trình sẽ khởi gán biến xác định vòng lặp một giá trị
giá_trị_đầu. Tiếp đó, nó sẽ kiểm tra điều kiện kết thúc vòng lặp ở biểu thức thứ hai, nếu như biểu thức đó xác định giá trị TRUE thì sẽ tiếp tục lặp, ngược lại sẽ thoát khỏi vòng lặp. Biểu thức thứ 3 xác định cách thức để tăng biến đếm nhằm đảm bảo đạt đến trạng thái kết thúc vòng lặp.
Ví dụ: Khi xây dựng các form HTML, trong nhiều trường hợp chúng ta cần phải hiển thị các hộp combo hiển thị danh sách ngày, tháng, năm... Lệnh for dưới đây sẽ cho phép in ra một đoạn mã HTML hiển thị hộp combo chọn ngày với số ngày từ 1 đến 31:
<?
$tmp=’<select name =”ngay”>’; for ($i=1;$i<=31;$i++)
$tmp.=’<option value=”’ . $i . ‘”>’ . $i . ‘</option>’; $tmp.=’</select>’;
echo $tmp; ?>
4. Câu lệnh thoát khỏi quá trình lặp
Trong quá trình thực hiện quá trình lặp, rất có thể chúng ta muốn thoát khỏi quá trình lặp ở một vòng lặp khi thỏa mãn một điều kiện nào đó
Để thực hiện điều này, chúng ta có thể sử dụng câu lệnh break. Câu lệnh này cho phép thoát khỏi vòng lặp bất kỳ lúc nào.
Ví dụ:
for ($i=0; $i<=10; $i++) {
if ($i>6) break;
echo “Giá trị của i là: “. $i; }
Thông thường, câu lệnh trên sẽ in giá trị của biến $i từ 1 đến 10. Tuy nhiên, trong thân câu lệnh for, chúng ta đã trang bị một lệnh if để xác định nếu như biến $i lớn hơn 6 thì sẽ thoát khỏi quá trình lặp. Vì vậy, câu lệnh for trên chỉ in ra các giá trị của biến $i từ 0 đến 6.
Câu lệnh break có thể được dùng để thoát khỏi bất kỳ vòng lặp nào: for, while, do...while. Ngoài ra, câu lệnh break còn được dùng để phân chia câu lệnh switch (xem lại câu lệnh rẽ nhiều nhánh).
Theo mặc định, câu lệnh break chỉ có tác dụng thoát khỏi quá trình lặp gần nó nhất. Để có thể thoát nhiều vòng lặp cùng một lúc, câu lệnh này có hỗ trợ một tham số tùy chọn để xác định sẽ thoát khỏi bao nhiêu vòng lặp lồng nhau cùng một lúc. Tuy nhiên đừng nên quá lạm dụng tham số này, nếu không chúng ta sẽ rất khó kiểm soát sự hoạt động của chương trình.
5. Câu lệnh bỏ qua vòng lặp hiện tại
Trái ngược với câu lệnh break dùng để thoát khỏi quá trình lặp, câu lệnh continue được sử dụng bên trong quá trình lặp để bỏ qua phần còn lại của vòng lặp và chuyển sang vòng lặp tiếp theo.
6. Tóm tắt và bài tập
Trong phần này chúng ta đã tìm hiểu các cấu trúc điều khiển cơ bản trong PHP. Hầu hết các cấu trúc điều khiển này cũng tương tự như C hay JavaScript
Viết chương trình để giải phương trình bậc nhất 1 ẩn số ax+b=0, với a, b là 2 số nhập vào từ bàn phím.
Bài tập số 2:
Viết chương trình nhập vào 1 số dạng năm (VD: 1980), từ đó chuyển sang dạng can chi của năm đó.
Gợi ý: Chu kỳ can chi được tính theo quy tắc sau: - Lấy số năm chia cho 10 lấy dư sẽ ra hàng can:
Số dư 0 1 2 3 4 5 6 7 8 9
Hàng Can Canh Tân Nhâm Quý Giáp Ất Bính Đinh Mậu Kỷ Lấy số dư của năm chia cho 12 sẽ ra hàng chi:
Số dư 0 1 2 3 4 5 6 7 8 9 10 11
Hàng chi Thân Dậu Tuất Hợi Tí Sửu Dần Mão Thìn Tị Ngọ Mùi Ví dụ: Năm 1980:
1980:10 dư 0 -> Canh 1980:12 dư 0 -> Thân
==> Năm 1980 là năm Canh Thân
- Phép chia lấy dư trong JavaScript: Xem trong phần Cơ bản về JavaScript -> Các phép toán cơ bản
Bài tập số 3: Nhập một số nguyên từ bàn phím, tính tổng các số từ 1 đến số nguyên đó. Chú ý làm thử bằng cả 3 vòng lặp.
Bài tập số 4: Nhập một số nguyên từ bàn phím, tính tổng các số chia hết cho 13 nằm trong khoảng từ 1 đến số nguyên đó. Chú ý làm thử bằng cả 3 vòng lặp.
V. Sử dụng hàm trong PHP
1. Hàm trong PHP.
chỉ cần phải viết duy nhất một lần, và có thể được sử dụng nhiều lần trong toàn bộ chương trình, và thậm chí có thể được tái sử dụng trong các ứng dụng khác.
Nhờ khả năng tái sử dụng trong các dự án khác nhau, các lập trình viên có kinh nghiệm thường tìm cách xây dựng hoặc sưu tập các hàm thành các thư viện để tận dụng trong các ứng dụng khác, qua đó giảm thời gian, chi phí cũng như công sức xây dựng các ứng dụng mới.
Một hàm sẽ được xác định bởi tên hàm và các tham số đầu vào liên quan đến hàm đó. Thông thường, hàm sẽ trả về một kết quả nào đó. Đối với các hàm dựng sẵn, ta có thể hình dung các hàm như các hộp đen, nhận các dữ liệu đầu vào, xử lý rồi trả kết quả về cho tên hàm.
Chúng ta có thể hình dung cách thức sử dụng hàm như sau:
Các câu lệnh như echo, print... của PHP thực chất phải được gọi là các hàm chứ không phải là một câu lệnh.
Ví dụ: Để giải thích rõ hơn khái niệm hàm, ta quay trở lại với "câu lệnh" echo quen thuộc. Hàm echo(chuỗi) có tên là echo, tham số đầu vào là một chuỗi, và chức năng (kết quả mà nó trả về) là một dòng chữ (được lưu trong biến chuỗi) được trả về trình duyệt.
PHP cung cấp một thư viện các hàm dựng sẵn rất phong phú, đủ để sử dụng trong hầu hết các ứng dụng. 2. Một số hàm thông dụng trong PHP a. Các hàm xử lý mảng PHP hỗ trợ khá nhiều hàm để xử lý mảng, chúng ta có thể sử dụng các hàm này để phát triển nhanh các ứng dụng. Hàm in mảng
Để in các giá trị lưu trong mảng, chúng ta có thể sử dụng hàm print_r(). Tên hàm Giá trị trả về Tham số 1 Tham số 2 ... Tham số n
Cú pháp:
Void print_r(mixed thông_tin)
Hàm print_r sẽ hiển thị thông tin về một biến theo cách mà con người có thể đọc được. Nếu như thông_tin được hiển thị là một chuỗi hay một số thì giá trị của thông tin sẽ được in ra màn hình. Trong trường hợp thông_tin là một mảng, các giá trị sẽ được trình bày theo cú pháp khóa và giá trị.
Hàm xây dựng mảng
Để xây dựng một mảng, ngoài cách đã giới thiệu ở mục II chương 4, chúng ta cũng có thể sử dụng hàm array().
Cú pháp:
array array(tham_số);
Hàm này sẽ trả về một mảng các tham số. Nếu có nhiều hơn 1 tham số, các tham số phải được đặt cách nhau bởi một dấu phẩy.
Ví dụ:
$can=array (‘giáp’, ‘ất’, ‘bính’,’đinh’,’mậu’,’kỷ’, ‘canh’, ‘tân’, ‘nhâm’, ‘quý’);
Trong trường hợp muốn xác định chỉ số của mảng, tham số cần phải đưa vào theo cấu trúc
chỉ_số=>giá_trị. Ví dụ:
$array = array( 1, 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13);
Cú pháp chỉ_số=>giá_trị, được ngăn cách nhau bởi các dấu phẩy, sẽ định nghĩa một chỉ số của mảng và gán giá trị cho phần tử của mảng có chỉ số chỉ_số. Trong trường hợp chúng ta không sử dụng cú pháp trên, các chỉ số sẽ được tự động sinh ra và bắt đầu bằng 0. Nếu như chỉ số là một số nguyên, chỉ số tiếp theo sẽ được tự động sinh ra bằng cách tăng thêm chỉ số trước đó 1 đơn vị. Khi có hai chỉ số trùng nhau, chỉ số cuối cùng sẽ ghi đè lên chỉ số trước đó.
Ví dụ:
$array = array( 1, 1, 1, 1, 1, 8=>1, 4=>1, 19, 3=>13); print_r($array);
Array ( [0] => 1 [1] => 1 [2] => 1 [3] => 13 [4] => 1 [8] => 1 [9] => 19 )
Hàm kiểm tra sự tồn tại của một giá trị trong mảng
Để xác định một giá trị nào đó có nằm trong mảng đã cho hay không, chúng ta có thể sử