Bài 2 - Mục 2: Lưu trữ dữ liệu trong PHP. Một số kiểu dữ liệu cơ bản [updated]
Ngoài lề một chút: Lúc đầu tớ cũng ko định tách Bài 2 ra làm mấy thread, nhưng nếu để như thế kia thì dài quá, sợ đọc theo các bác mệt mắt => nản lòng.
Ta có một số kiểu dữ liệu cơ bản sau đây trong PHP:
a. Kiểu số (number)
b. Kiểu xâu (string)
c. Kiểu boolean (boolean)
a. Kiểu số
Trong kiểu số (lại) có 2 kiểu cơ bản khác: Số nguyên (int) và số thực (float). Số nguyên có thể biểu diễn bằng số thập phân (hệ 10 - decimal), hệ 8 (octal) và hệ 16 (hexadecimal).
Ví dụ ta gán giá trị cho một số biến kiểu NGUYÊN như sau:
PHP Code:
$a = 27;
$b = -27;
$c = 027;
$d = -027;
$e = 0x27;
$f = -0x27;
?>
Ở ví dụ trên, cả 6 biến từ $a đến $f đều có giá trị là 27 hoặc -27. Tuy nhiên, với biến $a và $b, ta dùng kiểu biểu diễn số thập phân (viết như số ta viết hàng ngày). Với $c và $d, dùng kiểu số hệ 8 (bắt đầu với chữ số 0). Với $e và $f dùng kiểu hệ 16 (bắt đầu với chữ số 0 và chữ cái x).
Nếu đã từng học qua Pascal, chắc chắn bạn sẽ hỏi tớ: Thế nếu tớ dùng 1 biến kiểu int, gán cho nó một giá trị cao bằng max của int, thì khi đem số đó cộng với 1, giá trị có bị chuyển thành âm do tràn số (overflow) ko?
Câu trả lời là ko. Một biến kiểu int có giá trị cực lớn trong PHP là 2147483647, khi cộng 1 vẫn sẽ trả giá trị đúng là 2147483648, nhưng lần này sẽ thuộc kiểu float. Nói cách khác, PHP tự chuyển số bị tràn lên kiểu float.
Nếu thích đặt câu hỏi, chắc chắn (lại một lần nữa) bạn sẽ hỏi tớ: Sao cậu biết điều ấy?
Câu trả lời rất đơn giản: Bạn hãy cùng tớ làm ví dụ với đoạn code sau:
PHP Code:
$a = 2147483647;
var_dump($a);
$a = $a + 1;
var_dump($a);
?>
Sau khi chạy script, kết quả trả về sẽ là
int(2147483647) float(2147483648)
=> Đúng như tớ nói nhá!
Tớ xin giải thích như thế này:
Ở dòng thứ nhất, ta đem gán giá trị 2147483647 cho $a. Đây là một giá trị cực to, nhưng vẫn nằm trong int, vì vậy $a sẽ thuộc kiểu int.
Dòng thứ 2 và thứ 4, ta dùng lệnh var_dump($a); Đây là lệnh in ra kiểu và giá trị của một biến trong PHP. Chú ý nhé, lệnh này khá phổ biến và hay được dùng để debug code.
Ở dòng thứ 3, ta dùng lệnh gán $a = $a + 1; Với các bạn đã học lập trình, điều này chẳng có gì khó hiểu. Sau khi thực thi lệnh, $a sẽ mang giá trị của $a cộng thêm với 1. Còn nếu (chẳng may) bạn chưa học lập trình bao giờ, thì tớ (lại) xin giải thích như thế này:
- Dấu bằng ở đây là lệnh gán, đem giá trị của vế phải gán cho vế trái, chứ ko phải là dấu bằng trong biểu thức toán học mà mình vẫn học. Do đó, ko có gì là trái với lẽ tự nhiên cả. :P
Một điều khác mà bạn nên nhớ, đó là hãy THẬT cẩn thận khi sử dụng số kiểu float trong PHP. Nó luôn chỉ là những giá trị xấp xỉ, và ko hề chính xác tuyệt đối. Do đó tốt nhất là chuyển số float sang int khi có thể. Cách làm sẽ được thảo luận sau.
Giờ ta sang kiểu xâu.
b. Kiểu xâu
Định nghĩa một cái nào: Xâu là một chuỗi các ký tự. Một câu tớ xì pam là một xâu. Cả cái bài viết này cũng có thể là một xâu.
Để sử dụng xâu, có 3 cách (hic, bắt đầu phức tạp rồi => mọi người đứng dậy vươn vai cái cho tỉnh táo! :P):
Cách 1 là dùng nháy đơn.
Cách 2 là dùng ngoặc kép (hay gọi là nháy kép gì cũng được).
Cách 3 là dùng kiểu HEREDOC.
Nói rõ nhé:
Cách 1: Xâu được đặt trong dấu nháy đơn.
PHP Code:
echo 'Đây là xâu đặt trong dấu nháy đơn';
?>
Sẽ có bạn hỏi tớ (sao hỏi nhiều thế!): Trong xâu có thể đặt dấu nháy đơn được ko? Kiểu như xâu là I'm a student ý.
Câu trả lời là bạn phải thêm một dấu sược (hay suộc gì ý) trước dấu nháy đơn "bất thường" ý. Như thế này:
PHP Code:
echo 'Trong nháy đơn lại có một nháy đơn như thế này \', và như thế này nữa \'.';
Đặt cái dấu đó (\) gọi là "escape the character". Nói nhỏ nhá: Bài tớ viết hay chèn tiếng Anh vào là để các bạn đỡ "bỡ ngỡ" khi đọc tut hay doc bằng Eng.
Một lần nữa, (lại) có một câu hỏi được đặt ra: Nếu trong xâu cũng có một dấu \ thì sao?
Câu trả lời cũng rất giản dị: Dùng thêm một dấu \ nữa ngay trước dấu \ ý. Như thế này \\
Lần này, sẽ ko có một câu hỏi, mà sẽ là một tiếng thở dài: Sao lắm thứ thế? Còn cái dấu nào phải "escape" như dấu \ và ' ko?
Có. Đó là:
1. \n : Báo hiệu xuống dòng trong PHP. Giống như
trong HTML.
2. \t : Thay mặt cho Tab
3. \$ : Dấu dollar (tránh "cạnh tranh lành mạnh" với tên biến mà! :P)
4. ... Để gặp nói sau. Nói nhiều e "tẩu hỏa nhập ma" chết!
Quên mất, trừ \' và \\, mấy cái escape này chỉ dùng trong trường hợp xâu đặt trong dấu ngoặc kép.
Hờ hờ, lại quên một điều phải nói trước khi chuyển qua phần kế tiếp: Nếu trong xâu ta ko thèm dùng dấu \, cũng kóc thèm dùng dấu ', mà dùng cả \' cho "dân chơi" thì sao?
Trả lời: Thì cứ làm như bình thường thôi. Như thế nè: \\\'. Dấu \ thứ 1 để escape cho dấu \ thứ 2. Dấu \ thứ 3 để escape cho dấu ' cuối cùng. Thường thôi!
Cách 2: Xâu được đặt trong dấu ngoặc kép (hay nháy kép - whatever)
Trường hợp này rất giống với sử dụng dấu nháy đơn đã nói ở trên.
PHP Code:
echo "Xâu này đặt trong dấu ngoặc kép";
?>
Sở dĩ nói RẤT giống mà ko phải HOÀN TOÀN giống vì giữa chúng có điểm khác nhau: Khi thực thi, PHP sẽ tìm và thay thế trong xâu những ký tự đặc biệt được escape (như \n, \t...) như đã nói ở trên, cùng với các biến (nếu có) trong xâu.
Ví dụ:
PHP Code:
$a = 1;
echo "Biến \$a có giá trị là $a";
?>
Sẽ cho ta kết quả: Biến $a có giá trị là 1
Trong khi đó, nếu sử dụng dấu nháy đơn:
PHP Code:
$a = 1;
echo 'Biến \$a có giá trị là $a';
?>
Lại in ra: Biến \$a có giá trị là $a
Điều đó cho thấy: Khi sử dụng dấu nháy đơn, giá trị của biến trong xâu, cùng với các ký tự đặc biệt cần escape sẽ ko được in ra. Các bạn nhớ kỹ điều này nhé!
Ta sang cách thứ 3: Xâu đặt trong cấu trúc HEREDOC
Ở cách 1, PHP sẽ nhận thấy 1 xâu được bắt đầu với dấu nháy đơn thứ nhất và kết thúc với dấu nháy đơn thứ 2. Tương tự với cách 2, nhưng là dấu ngoặc kép.
Ở cách 3 này, PHP sẽ coi một xâu bắt đầu bằng 3 dấu nhỏ hơn viết liền nhau <<<, đi kèm với 1 tên định danh (identifier) tùy ý bạn đặt tên, ví dụ là HERE, kết thúc là tên đó kèm theo dấu ;
Nghe có vẻ hơi phức tạp, nhưng bạn hãy cùng tớ gõ ví dụ sau: (chú ý là chữ HERE có thể thay bằng bất cứ chữ gì, tên bạn chẳng hạn, miễn là nó tuân theo nguyên tắc đặt tên biến của PHP. À, mà nhớ là mở bằng <<
PHP Code:
echo << Xâu được ghi ở dòng thứ nhất
Dòng thứ 2
Dòng thứ 3
Vân vân
HERE;
?>
Nhìn vào ví dụ trên, bạn có nhận xét gì?
Thứ nhất, xâu ko nhất thiết phải thuộc một dòng. Nó ko nhất thiết phải ngắn gọn, mà có thể dài "tràng giang đại hải" ra mấy chục dòng cũng được. Điều này rất tiện nếu bạn muốn echo một lúc cả một bài thơ chẳng hạn!
Thứ hai, chữ HERE; ở dòng cuối cùng tớ ko căn lề với chữ echo ở dòng 1. Đó là LUẬT, dù tớ thấy hơi "bất công" và "nghiệt ngã" một tí:
- Sau <<- Trước và sau HERE; cũng thế. Ko được phép có dù chỉ 1 ký tự trằng. Nói cách khác, đừng dại gì căn lề cho dòng này.
Cái gì là LUẬT thì phải THEO, cãi ko được Còn nếu ko theo, PHP sẽ báo lỗi:
Quote:
Parse error: parse error, unexpected T_SL in E:\XAMPP\htdocs\test.php on line 2
Tớ nói dông dài như vậy là vì đã từng mất bao nhiêu thời gian mới tìm ra được lỗi sai của mình. Chỉ vì một dấu cách mà chương trình đình công, ko thèm chạy! Kinh nghiệm xương máu!
Còn một ý nữa: Nếu từ nãy đến giờ bạn chỉ đọc "chay", ko thực hành thì (chưa chắc) đã nhận thấy: Khi chạy chương trinh, thay vì in ra mấy dòng như trên, PHP lại in mọi thứ ra cùng 1 dòng:
Quote:
Xâu được ghi ở dòng thứ nhất Dòng thứ 2 Dòng thứ 3 Vân vân
Sửa chữa điều này cũng khá đơn giản:
PHP Code:
$s = << Xâu được ghi ở dòng thứ nhất
Dòng thứ 2
Dòng thứ 3
Vân vân
HERE;
echo nl2br($s);
?>
Có gì bí ẩn ở đây ko? Thay vì echo thẳng mấy dòng kia ra, ta đi "vòng vèo" một chút bằng cách gán xâu chứa mấy dòng đó cho biến $s, sau đó echo nl2br($s) ra màn hình.
nl2br() được gọi là một hàm (function). Nó nhận một xâu làm tham số (parameter), ở đây là xâu $s, sau đó in ra theo luật: Cứ gặp dấu xuống dòng trong code là chuyển thành dấu xuống dòng trong HTML.
Cái tên nl2br cũng chẳng phải thần chú gì khó nhớ, nó rất giản dị: chỉ là viết tắt của new-line-to-br. New-line là dấu xuống dòng trong code, 2 là to , br là
(thẻ xuống dòng trong HTML).
Vậy là vấn đề đã được giải quyết. Kết quả in ra đúng như mong đợi:
Quote:
Xâu được ghi ở dòng thứ nhất
Dòng thứ 2
Dòng thứ 3
Vân vân
Kiểu dữ liệu cơ bản cuối cùng mà tớ sẽ nói tới chính là Kiểu boolean.
c. Kiểu boolean
Đây là kiểu dữ liệu đơn giản nhất trong PHP (đỡ quá!). Ý tưởng rất đơn giản: Mọi thứ chỉ thuộc vào 1 trong 2 loại: Đúng hoặc Sai, Có và Không, 1 và 0. Không có ngoại lệ. Anh ko là True thì sẽ là False. Ở đây ko có chỗ cho người ba phải!!!
Giá trị của biến kiểu boolean là TRUE hoặc FALSE. Hai từ này hoàn toàn ko phân biện hoa thường, vì vậy có thể viết như thế nào cũng được: TRue, tRUe, true, ...
Ví dụ:
PHP Code:
$a = TRUE;
$b = false;
?>
Một kiểu dữ liệu đơn giản đồng nghĩa với việc ko cần giải thích nhiều về ví dụ của nó.
Nhưng nó lại ko đồng nghĩa với việc: Kiểu boolean chẳng có gì đáng nói! Thực tế là kiểu này rất hay dùng trong PHP, ví dụ khi tính toán một biểu thức và xem giá trị của nó có lớn hơn một số nào đấy hay ko... (biểu thức điều kiện)
Xin được kết thúc Bài 2 tại đây. Cảm ơn quý vị đã quan tâm theo dõi...
COMING UP NEXT: Một số hàm cần thiết khi debug code
identical(UDS)