Nov
30
2010

Bài 5 – Hằng, biến biến và cách nhập dữ liệu từ bàn phím

(Bài học lên mạng ngày 30/11/2010) Kết thúc bài này, chúng ta sẽ có trong tay gần như đầy đủ “vũ khí đạn được” để tăng tốc, bắt tay vào viết những chương trình tương đối hoàn chỉnh và hữu ích.

Hằng

Để bắt đầu, chúng ta cùng nghiên cứu thắc mắc của bạn Phương (phù thuỷ lãng quên thời gian) trong bài tập trước:

Khi em check thủ công thế này
<?php
$a=aaakkkdfddd;
var_dump($a);
?>
thì php vẫn chạy tốt
nhưng khi check thế này
<?php
$a=gfgdigdj gbhdug;
var_dump($a);
?>
thì php báo lỗi check tương tự với các ký tự đặc biệt khác như ~@@#$% thì nó cũng báo lỗi

Để trả lời câu hỏi này, bạn Phương cần biết đến khái niệm “hằng”. Ở bài học trước, chúng ta đã nghiên cứu về biến và cách gán giá trị cho biến ($a = 5 chẳng hạn).

Trong khi biến là những giá trị biến thiên, có thể thay đổi được thì hằng là một giá trị cố định, không thay đổi được sau lần định nghĩa và gán giá trị đầu tiên. Hằng phân biệt với biến ở chỗ không có dấu $ đằng trước.

Để định nghĩa một hằng, các bạn dùng cú pháp như sau:

define(Pi, 3.141592654);

image
Trong đó Pi là tên Hằng và 3.141592654 là giá trị của Hằng.

Tương tự như với biến, tên Hằng phân biệt chữ Hoa chữ thường và kiểu dữ liệu của Hằng phụ thuộc vào giá trị mà nó đang nắm giữ.

image

Dòng 3 định nghĩa Hằng tên Pi (P viết Hoa và i viết thường), vì thế chỉ có truy xuất Pi mới cho ra giá trị 3.141592654 trong khi các truy xuất pi, pI và PI cho ra giá trị trùng với tên hằng.

Đó là vì, khi bạn truy xuất đến một “hằng” chưa được định nghĩa và gán giá trị, PHP sẽ trả về đúng giá trị của chuỗi ký tự mà bạn đang truy xuất.

Đó là lý do trong đoạn code mà bạn Phương mang ra “thí nghiệm”:

<?php
$a=aaakkkdfddd;
var_dump($a);
?>

PHP sẽ diễn dịch rằng bạn Phương muốn khai báo một biến $a và gán cho biến $a này giá trị của một hằng tên là aaakkkdfddd. Tuy nhiên, do aaakkkdfddd chưa được định nghĩa từ trước như một tên hằng, nên PHP trả về chuỗi aaakkkdfddd và gán giá trị chuỗi này cho biến $a. Tức là, đoạn code trên của Phương sẽ tương đương với:

<?php
$a=’aaaakkkddd’;
var_dump($a);
?>

Tôi hiểu bạn Phương đang muốn thử gán cho $a một chuỗi nhưng bạn quên đưa dấu nháy đơn ‘ hoặc dấu nháy kép vô phần định nghĩa chuỗi. Nhưng PHP – như tôi đã nói – không đủ thông minh để phán đoán bạn muốn làm gì, nó chỉ đơn thuần thông dịch đúng từ trên xuống từ trái qua phải và vô tình đoạn code của bạn không bị “báo lỗi” khai báo sai cú pháp dữ liệu string!

Tuy nhiên, khi bạn viết tiếp thế này:

<?php
$a=gfgdigdj gbhdug;
var_dump($a);
?>

Thì PHP báo lỗi. Vì nó đã không “vô tình đúng” như ở ví dụ trên nữa rồi. Giả sử chúng ta thêm một dấu ; vào vị trí khoảng trắng thì chương trình sẽ hết lỗi ngay:

image

Do $a=gfgdigdj; được hiểu như một phép gán giá trị của hằng gfgdigdj vào cho biến $a còn gbhdug; được coi như một biểu thức… không làm gì hết! (Giống như ở bài 2, tôi đề cập việc bạn có thể ghi 1; $a; $b; thì PHP vẫn coi là đúng, nó đơn thuần sẽ “chạy qua” mà không làm gì cả).

Tại sao PHP đã có biến lại còn phải “đẻ ra” hằng? Sau này học về hàm (funtions) bạn sẽ biết sự khác nhau giữa hằng và biến khi được triệu gọi trong và ngoài hàm. Còn hiện tại, tôi chỉ đơn thuần thông qua thắc mắc của bạn Phương để giới thiệu khái niệm Hằng.

Biến biến

Là một khái niệm rất lạ của PHP, tôi không biết phải định nghĩa thế nào cho chuẩn xác, nhưng qua một ví dụ đơn giản thế này, các bạn sẽ hình dung được:

<?php
$a = ‘MeoMun’;
$MeoMun = ‘Nguyen Ngoc Long’;
echo ‘$a = ‘,$a,’; $$a = ‘,$$a;
?>

image

Có thể hiểu rằng khi gặp $$a, PHP sẽ trả về giá trị của $a trước nhất. Khi này

$$a = ${$a} = ${MeoMun} = $MeoMun

$MeoMun = ‘Nguyen Ngoc Long’ nên giá trị cuối cùng chúng ta nhận được sẽ là Nguyen Ngoc Long

Mới nhìn thì bạn sẽ thấy rằng khái niệm này có vẻ hơi rắc rối và vô nghĩa, nhưng nó lại vô cùng hữu ích trong một vài trường hợp (ví dụ sau này học nâng cao, bạn có thể dùng biến-biến để phát sinh phương thức động của một đối tượng).

Cách nhập dữ liệu từ bàn phím

Với chủ trương giúp các bạn không bị rơi vào “mê hồn trận” của những đoạn mã trộn lẫn lộn HTML+CSS+JavaScript+SQL+PHP, tôi cố gắng không đồng nhất việc nhập dữ liệu vào PHP với việc truyền dữ liệu thông qua trình duyệt (cũng như việc xuất dữ liệu ra màn hình với việc “trả về dữ liệu HTML cho trình duyệt”).

Hiểu điều này sẽ rất có lợi cho các bạn ở bài học kế, khi chúng ta bắt đầu “nhúng” mã PHP vào trong trang web.

Để cho phép người dùng đưa một giá trị từ bàn phím vào chương trình PHP, các bạn sử dụng cách thức như sau:

<?php
echo ‘Nhap vao mot gia tri bat ky: ‘;
$data = fgets(fopen(‘php://stdin’,’r’));
echo ‘Ban vua nhap vao gia tri:’,”\n”;
echo $data;
?>

Dòng màu cam là cú pháp để chờ người dùng nhập dữ liệu vào từ bàn phím (kết thúc bởi phím Enter). Bạn chưa và không cần tìm hiểu đoạn mã phía sau dấu = đâu, chỉ cần chú ý $data là tên biến nhận giá trị mà người dùng nhập vào. Bạn có thể thay $data bằng bất cứ tên biến nào mà bạn thích. Kết quả chạy chương trình:

Ví dụ sau minh hoạ chương trình tính tổng 2 số bất kì nhập vào từ bàn phím:

<?php
echo ‘Chuong trinh tinh tong 2 so bat ky’,”\n”;
echo ‘Nhap so thu nhat A = ‘; $a = fgets(fopen(‘php://stdin’,’r’));
echo ‘Nhap so thu hai B = ‘; $b = fgets(fopen(‘php://stdin’,’r’));
echo $a, ‘ + ‘, $b, ‘ = ‘, $a+$b;
?>

Kết quả chạy chương trình như sau:

image

Bài tập 5.1 Hãy giải thích tại sao trong ví dụ tính tổng 2 số, khi hiển thị kết quả ra màn hình, dấu + sau 34 và dấu = sau 56 lại bị rơi xuống hàng dưới? Hãy sửa lại source code để kết quả in ra “đẹp hơn” như sau:

image

Bài 5.2 Viết chương trình thực hiện các việc sau:

  1. Định nghĩa một hằng tên là Pi = 3.141592654
  2. Cho người dùng nhập vào một số giá trị bất kì
  3. Hiển thị thông tin tính diện tích hình tròn có bán kính bằng với giá trị mà người dùng vừa nhập vào

Bài 5.3 Viết chương trình nhập họ tên và ngày, tháng, năm sinh của người sử dụng (4 lần nhập riêng rẽ), sau đó in ra màn hình ngày tháng năm sinh của họ dưới dạng D/M/YYYY và cho biết họ hiện được bao nhiêu tuổi. Ví dụ người dùng tên Long, ngày sinh = 4; tháng = 11; năm = 1983, viết ra “Xin chào Long, bạn sinh ngày 4/11/1983. Năm nay bạn được 27 tuổi”.

Bài 5.4 Viết chương trình tính thể tích hình lập phương với số đo một cạnh nhập từ bàn phím.

Chú ý quy định mới về việc gửi bài:

1) Nén tất cả các folder / file liên quan đến bài giải của bạn (doc, php, txt, png, jpg…) vào một file duy nhất, đặt tên là HoVaTen_TenBaiTap.zip, ví dụ NguyenNgocLong_Bai4.zip là lời giải cho bài tập số 4 của bạn tên Nguyễn Ngọc Long; NguyenVoCaoMinh_Bai3.zip là lời giải cho bài tập số 3 của bạn tên Nguyễn Võ Cao Minh.

2) Khi gửi email nộp bài, các bạn ghi vô trong phần nội dung email cho tôi biết tên bạn là gì (vì có một số bạn tôi có thể “đoán” được tên thông qua địa chỉ email, nhưng một số bạn khác thì không).

Tôi sẽ thiết lập chế độ chuyển email tự động upload bài giải (các file zip) của cả lớp vô một thư mục công cộng trên trang http://box.net. Sau này, khi đọc phần nội dung comment của tôi cho bài giải của cả lớp, các bạn thấy bài của ai có chi tiết thú vị thì có thể truy cập vô thư mục chia sẻ trên box.net tải về phần lời giải đầy đủ của người đó (theo họ và tên) để tiện tham khảo.

Các bạn nộp bài trước 12h trưa thứ 5, ngày 2/12/2010.

About the Author:

1 Comment + Add Comment

  • […] Bài 6.10 (*): Nhập vào một số bất kì trong khoảng từ 1 đến 30. Ghi ra màn hình nghĩa tiếng Anh tương ứng của số đếm đó và dùng ít số câu lệnh nhất có thể. Chú ý, các bạn chỉ được dùng những kiến thức đã học + giải pháp do các bạn suy nghĩ để giải quyết vấn đề. Gợi ý: có thể dùng biến biến (Bài 5). […]

Leave a comment