Tìm hiểu các loại dữ liệu trong PHP
PHP Tutorial | by
Việc hiểu rõ các loại dữ liệu không chỉ là một khái niệm lý thuyết. Nó quyết định cách bạn lưu trữ thông tin trong biến, cách bạn thực hiện các phép toán, và thậm chí là cách chương trình của bạn hoạt động hiệu quả và tránh được lỗi. PHP, với tính chất định kiểu động, mang lại sự linh hoạt đáng kinh ngạc, nhưng cũng đòi hỏi bạn phải nắm vững cách nó xử lý các loại dữ liệu khác nhau.
Trong bài viết này, mình sẽ cùng nhau tìm hiểu sâu hơn về các loại dữ liệu mà PHP hỗ trợ – từ những con số đơn giản, chuỗi văn bản, các giá trị logic, cho đến những cấu trúc phức tạp như mảng và đối tượng. Bắt đầu thôi nào!
Dữ liệu là gì trong lập trình?
-
Khái niệm: Trong lập trình, dữ liệu là bất kỳ thông tin nào mà một chương trình máy tính có thể xử lý, lưu trữ và thao tác. Dữ liệu có thể là số, chữ cái, hình ảnh, âm thanh, hay bất cứ thứ gì có thể được biểu diễn dưới dạng kỹ thuật số.
-
Tầm quan trọng: Việc hiểu rõ các loại dữ liệu là vô cùng quan trọng vì nó:
- Xác định cách dữ liệu được lưu trữ trong bộ nhớ: Mỗi loại dữ liệu (ví dụ: số nguyên, số thập phân, chuỗi ký tự) sẽ chiếm một lượng không gian bộ nhớ khác nhau và được biểu diễn theo cách riêng biệt trong máy tính. Việc này ảnh hưởng đến hiệu suất và tài nguyên mà chương trình của bạn tiêu thụ.
- Xác định cách chúng ta có thể tương tác với chúng (phép toán, hàm): Bạn không thể thực hiện phép nhân giữa một con số và một đoạn văn bản. Kiểu dữ liệu quy định những phép toán (cộng, trừ, nhân, chia, v.v.) hay các hàm nào bạn có thể áp dụng lên chúng một cách hợp lệ.
- Ví dụ: Bạn có thể cộng
5
với3
nhưng không thể cộng5
với"Hello"
.
- Ví dụ: Bạn có thể cộng
- Xác định cách chúng được truyền giữa các phần của chương trình: Khi bạn truyền dữ liệu từ một hàm này sang hàm khác, hoặc từ PHP sang cơ sở dữ liệu, kiểu dữ liệu cần được xử lý đúng cách để tránh lỗi hoặc mất mát thông tin.
Tính chất định kiểu động (Dynamically Typed) của PHP
Một trong những đặc điểm nổi bật và cũng là điểm cần lưu ý của PHP là nó là một ngôn ngữ định kiểu động (dynamically typed).
Mô tả: Điều này có nghĩa là khi bạn khai báo một biến trong PHP, bạn không cần phải chỉ định kiểu dữ liệu của biến đó ngay lập tức. PHP sẽ tự động xác định (hoặc "suy luận") kiểu dữ liệu của biến dựa trên giá trị mà bạn gán cho nó tại thời điểm chạy (runtime).
-
Ví dụ minh họa:
<?php $soNguyen = 10; // PHP tự động hiểu $soNguyen là kiểu Integer $ten = "Nguyen Van A"; // PHP tự động hiểu $ten là kiểu String $giaTriThuc = 3.14; // PHP tự động hiểu $giaTriThuc là kiểu Float $kiemTra = true; // PHP tự động hiểu $kiemTra là kiểu Boolean // Bạn có thể thay đổi kiểu dữ liệu của biến trong quá trình chạy $soNguyen = "Muoi"; // Giờ đây $soNguyen trở thành kiểu String ?>
Trong các ngôn ngữ định kiểu tĩnh (ví dụ: Java, C++), bạn sẽ phải khai báo rõ ràng kiểu dữ liệu như int soNguyen = 10;
và không thể gán một chuỗi cho nó sau này.
Ưu điểm:
- Code ngắn gọn và linh hoạt: Bạn không cần phải viết thêm các khai báo kiểu dữ liệu, giúp code trông "nhẹ nhàng" hơn và bạn có thể nhanh chóng thay đổi kiểu dữ liệu của biến nếu cần.
- Dễ học cho người mới bắt đầu: Tính linh hoạt này giúp người học ít phải lo lắng về các quy tắc kiểu dữ liệu phức tạp ngay từ đầu.
Nhược điểm:
- Có thể dẫn đến lỗi không mong muốn nếu không quản lý cẩn thận: Vì PHP tự động chuyển đổi kiểu dữ liệu (hay còn gọi là type juggling), đôi khi nó có thể thực hiện một phép toán mà bạn không lường trước được. Điều này có thể dẫn đến các lỗi logic khó phát hiện (ví dụ: thực hiện phép cộng số học trên một chuỗi chứa chữ cái) hoặc kết quả không chính xác.
Ví dụ:
<?php $soA = 10; $soB = "5"; // Đây là một chuỗi, không phải số nguyên $tong = $soA + $soB; // PHP sẽ tự động chuyển đổi "5" thành số 5 echo "Tổng: " . $tong; // Output: Tổng: 15 (có vẻ đúng, nhưng ẩn chứa rủi ro) $chuoiSai = "abc"; $ketQua = $soA + $chuoiSai; // PHP sẽ cố gắng chuyển đổi "abc" thành số 0 echo "Kết quả: " . $ketQua; // Output: Kết quả: 10 (có thể không phải điều bạn muốn) ?>
Các loại dữ liệu cơ bản (Scalar Types) trong PHP
Các kiểu dữ liệu cơ bản, hay còn gọi là Scalar Types, là những loại dữ liệu đơn giản nhất trong PHP. Mỗi biến thuộc một trong các kiểu này chỉ có thể chứa một giá trị duy nhất tại một thời điểm.
Kiểu Integer (Số nguyên)
Định nghĩa: Kiểu Integer dùng để biểu diễn các số nguyên, tức là các số không có phần thập phân. Chúng có thể là số dương, số âm hoặc số 0.
- Ví dụ:
5
,-100
,0
,12345
.
Phạm vi: Phạm vi của số nguyên mà PHP có thể xử lý phụ thuộc vào kiến trúc hệ thống nơi PHP đang chạy.
- Trên hệ thống 32-bit, phạm vi thường là từ khoảng
-2 tỷ
đến+2 tỷ
. - Trên hệ thống 64-bit, phạm vi lớn hơn rất nhiều.
- PHP cung cấp các hằng số tích hợp để bạn kiểm tra phạm vi này:
PHP_INT_MAX
(giá trị nguyên lớn nhất) vàPHP_INT_MIN
(giá trị nguyên nhỏ nhất). Nếu một phép tính vượt quá phạm vi này, số nguyên sẽ tự động chuyển đổi thành kiểu Float.
Cách khai báo: Bạn khai báo một biến kiểu Integer bằng cách gán trực tiếp một số nguyên cho nó.
Ví dụ Code:
<?php $soDiem = 100; $soAm = -50; $soKhong = 0; $soLon = 2147483647; // Giá trị lớn nhất trên hệ thống 32-bit (PHP_INT_MAX) echo "Số điểm: " . $soDiem . "<br>"; echo "Số âm: " . $soAm . "<br>"; echo "Số không: " . $soKhong . "<br>"; echo "Số lớn: " . $soLon . "<br>"; // Kiểm tra kiểu dữ liệu echo "Kiểu của \$soDiem: " . gettype($soDiem) . "<br>"; // Phạm vi số nguyên trên hệ thống của bạn echo "Giá trị nguyên lớn nhất: " . PHP_INT_MAX . "<br>"; echo "Giá trị nguyên nhỏ nhất: " . PHP_INT_MIN . "<br>"; // Minh họa tràn số (overflow) - tự động chuyển sang float $soRatLon = PHP_INT_MAX + 1; echo "Số rất lớn (PHP_INT_MAX + 1): " . $soRatLon . "<br>"; echo "Kiểu của \$soRatLon: " . gettype($soRatLon) . "<br>"; // Sẽ là double (float) ?>
Kiểu Float (Số thực / Số chấm động / Double)
Định nghĩa: Kiểu Float (còn gọi là Floating-point numbers, Doubles hoặc Real numbers) dùng để biểu diễn các số có phần thập phân hoặc số có dạng mũ.
- Ví dụ:
3.14
,-0.001
,1.2e3
(tức là 1.2 * 10^3 = 1200),7.0
.
Độ chính xác: Một điểm quan trọng cần lưu ý là các số thực được biểu diễn trong máy tính bằng cách sử dụng dấu chấm động, điều này có thể dẫn đến độ chính xác không hoàn hảo trong một số phép tính, đặc biệt là khi so sánh hoặc làm việc với các số rất nhỏ hoặc rất lớn. Tránh so sánh trực tiếp hai số float bằng toán tử ==
.
Cách khai báo: Bạn khai báo một biến kiểu Float bằng cách gán một số có dấu chấm thập phân hoặc dạng mũ cho nó.
Ví dụ Code:
<?php $pi = 3.14159; $giaTienLe = 19.99; $khoangCachXa = 1.5e6; // Tương đương 1,500,000.0 $soKhongPhayKhongMot = 0.001; echo "Giá trị Pi: " . $pi . "<br>"; echo "Giá tiền lẻ: " . $giaTienLe . "<br>"; echo "Khoảng cách xa: " . $khoangCachXa . "<br>"; echo "Số 0.001: " . $soKhongPhayKhongMot . "<br>"; // Kiểm tra kiểu dữ liệu echo "Kiểu của \$pi: " . gettype($pi) . "<br>"; // Minh họa vấn đề độ chính xác (ví dụ phổ biến) $a = 0.1 + 0.2; $b = 0.3; echo "0.1 + 0.2 = " . $a . "<br>"; // Sẽ là 0.30000000000000004 echo "0.3 = " . $b . "<br>"; if ($a == $b) { echo "0.1 + 0.2 BẰNG 0.3 (điều này thường sai do độ chính xác)<br>"; } else { echo "0.1 + 0.2 KHÔNG BẰNG 0.3 (đúng hơn trong máy tính)<br>"; } // Để so sánh float, nên dùng một sai số nhỏ (epsilon) if (abs($a - $b) < 0.00001) { echo "0.1 + 0.2 GẦN BẰNG 0.3 (cách so sánh float tốt hơn)<br>"; } ?>
Kiểu String (Chuỗi)
Định nghĩa: Kiểu String là một chuỗi các ký tự. Chúng được sử dụng để lưu trữ văn bản, tên, địa chỉ, v.v. Các chuỗi trong PHP được bao quanh bởi dấu nháy đơn ('
) hoặc nháy kép ("
).
Đặc điểm:
- Nháy đơn: Chuỗi bên trong dấu nháy đơn được xử lý "nguyên văn" (literal). PHP không thực hiện nội suy biến hoặc xử lý các ký tự thoát đặc biệt bên trong chuỗi nháy đơn (trừ
'
để thoát dấu nháy đơn và\\
để thoát dấu gạch chéo ngược).
<?php $ten = "An"; echo 'Tên tôi là $ten. Đây là \n xuống dòng.'; // Kết quả: Tên tôi là $ten. Đây là \n xuống dòng. ?>
Nháy kép: Chuỗi bên trong dấu nháy kép hỗ trợ nội suy biến (PHP sẽ thay thế $variable
bằng giá trị của biến đó) và xử lý ký tự thoát (như \n
cho xuống dòng, \t
cho tab, \\
cho dấu gạch chéo ngược, \"
để thoát dấu nháy kép).
<?php $ten = "An"; echo "Tên tôi là $ten. Đây là \n xuống dòng."; // Kết quả: Tên tôi là An. Đây là // xuống dòng. ?>
Heredoc và Nowdoc:
- Heredoc (
<<<TEN_DINH_DANH
): Giúp bạn định nghĩa chuỗi dài, có nhiều dòng và chứa dấu nháy mà không cần thoát. Nó hoạt động giống như chuỗi nháy kép, hỗ trợ nội suy biến. - Nowdoc (
<<<'TEN_DINH_DANH'
): Giống Heredoc nhưng hoạt động như chuỗi nháy đơn, không hỗ trợ nội suy biến. Hữu ích khi bạn muốn in một khối văn bản lớn mà không muốn PHP xử lý bất kỳ biến hay ký tự thoát nào bên trong.
Phép toán trên chuỗi:
- Nối chuỗi (
.
): Sử dụng dấu chấm để nối (ghép) hai hoặc nhiều chuỗi lại với nhau. - Truy cập ký tự bằng offset (
$string[0]
): Bạn có thể truy cập từng ký tự trong chuỗi giống như một mảng ký tự, sử dụng chỉ mục (offset) bắt đầu từ 0.
Ví dụ Code:
<?php $tenSach = "Kỹ thuật lập trình PHP"; $tacGia = "Nguyễn Văn A"; $namXuatBan = 2023; // Sử dụng nháy đơn và nháy kép echo 'Đây là chuỗi trong nháy đơn.<br>'; echo "Đây là chuỗi trong nháy kép.<br>"; // Nội suy biến (chỉ với nháy kép) echo "Cuốn sách \"$tenSach\" được viết bởi $tacGia.<br>"; echo 'Năm xuất bản: $namXuatBan (không nội suy trong nháy đơn).<br>'; // Sẽ in ra $namXuatBan // Nối chuỗi bằng dấu chấm echo "Thông tin chi tiết: " . $tenSach . " - " . $tacGia . " (" . $namXuatBan . ").<br>"; // Truy cập ký tự trong chuỗi echo "Ký tự đầu tiên của tên sách: " . $tenSach[0] . "<br>"; // K echo "Ký tự thứ 5 của tên sách: " . $tenSach[4] . "<br>"; // t // Heredoc - cho chuỗi dài, hỗ trợ nội suy echo <<<EOT <p>Đây là một đoạn văn bản dài sử dụng Heredoc. Nó có thể bao gồm nhiều dòng và các dấu "nháy kép" hoặc 'nháy đơn' mà không cần thoát. Biến \$tacGia là: $tacGia. </p> EOT; // Nowdoc - giống Heredoc nhưng không nội suy (PHP 5.3+) echo <<<'END_OF_TEXT' <p>Đây là một đoạn văn bản dài sử dụng Nowdoc. Nó cũng bao gồm nhiều dòng và các dấu "nháy kép" hoặc 'nháy đơn'. NHƯNG, biến \$tacGia: $tacGia SẼ KHÔNG ĐƯỢC NỘI SUY. </p> END_OF_TEXT; ?>
Kiểu Boolean (Logic)
Định nghĩa: Kiểu Boolean là kiểu dữ liệu đơn giản nhất, chỉ có hai giá trị có thể có: true
(đúng) hoặc false
(sai).
Ứng dụng: Kiểu Boolean là nền tảng của các câu lệnh điều kiện và vòng lặp, giúp chương trình của bạn đưa ra quyết định dựa trên các điều kiện.
- Ví dụ:
if ($loggedIn == true)
(Nếu người dùng đã đăng nhập)while ($gameRunning == true)
(Trong khi trò chơi đang chạy)
Giá trị được coi là false
(falsy values) trong ngữ cảnh boolean: Khi PHP cần chuyển đổi một giá trị sang kiểu Boolean (ví dụ: trong một câu lệnh if
), một số giá trị sẽ được coi là false
. Tất cả các giá trị khác sẽ được coi là true
.
- Các giá trị
falsy
:- Số nguyên
0
- Số thực
0.0
- Chuỗi rỗng
""
- Chuỗi
"0"
(chuỗi chứa duy nhất ký tự số 0) null
- Một mảng rỗng (
[]
) - Một đối tượng SimpleXML rỗng (thường gặp khi làm việc với XML)
- Giá trị
false
(tất nhiên!)
- Số nguyên
Ví dụ Code:
<?php $dangNhapThanhCong = true; $coLoi = false; // Sử dụng trong câu lệnh điều kiện if ($dangNhapThanhCong) { echo "Người dùng đã đăng nhập.<br>"; } else { echo "Người dùng chưa đăng nhập.<br>"; } if ($coLoi) { echo "Có lỗi xảy ra.<br>"; } else { echo "Mọi thứ đều ổn.<br>"; } echo "<hr>"; echo "<h2>Các giá trị được coi là FALSE (Falsy values):</h2>"; // Minh họa các giá trị được coi là false $giaTriTest = 0; // Integer 0 if ($giaTriTest) { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là TRUE.<br>"; } else { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là FALSE.<br>"; } $giaTriTest = 0.0; // Float 0.0 if ($giaTriTest) { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là TRUE.<br>"; } else { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là FALSE.<br>"; } $giaTriTest = ""; // Chuỗi rỗng if ($giaTriTest) { echo "Giá trị \"\" được coi là TRUE.<br>"; } else { echo "Giá trị \"\" được coi là FALSE.<br>"; } $giaTriTest = "0"; // Chuỗi "0" if ($giaTriTest) { echo "Giá trị \"0\" được coi là TRUE.<br>"; } else { echo "Giá trị \"0\" được coi là FALSE.<br>"; } $giaTriTest = null; // null if ($giaTriTest) { echo "Giá trị null được coi là TRUE.<br>"; } else { echo "Giá trị null được coi là FALSE.<br>"; } $giaTriTest = []; // Mảng rỗng if ($giaTriTest) { echo "Giá trị [] được coi là TRUE.<br>"; } else { echo "Giá trị [] được coi là FALSE.<br>"; } $giaTriTest = false; // Bản thân false if ($giaTriTest) { echo "Giá trị false được coi là TRUE.<br>"; } else { echo "Giá trị false được coi là FALSE.<br>"; } echo "<hr>"; echo "<h2>Các giá trị được coi là TRUE (Truthy values):</h2>"; $giaTriTest = 1; // Bất kỳ số nguyên khác 0 if ($giaTriTest) { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là TRUE.<br>"; } else { echo "Giá trị " . var_export($giaTriTest, true) . " được coi là FALSE.<br>"; } $giaTriTest = "Hello"; // Bất kỳ chuỗi không rỗng nào khác "0" if ($giaTriTest) { echo "Giá trị \"Hello\" được coi là TRUE.<br>"; } else { echo "Giá trị \"Hello\" được coi là FALSE.<br>"; } $giaTriTest = [1, 2]; // Mảng không rỗng if ($giaTriTest) { echo "Giá trị [1, 2] được coi là TRUE.<br>"; } else { echo "Giá trị [1, 2] được coi là FALSE.<br>"; } // Lưu ý: var_export($var, true) được dùng để hiển thị giá trị của biến một cách rõ ràng, // bao gồm cả kiểu dữ liệu cho null, boolean, array rỗng, vv. ?>
Các loại dữ liệu phức hợp (Compound Types) trong PHP
Trái ngược với các kiểu dữ liệu cơ bản chỉ lưu trữ một giá trị duy nhất, kiểu dữ liệu phức hợp (Compound Types) cho phép bạn lưu trữ nhiều giá trị hoặc một tập hợp các dữ liệu có tổ chức. Đây là những công cụ mạnh mẽ để quản lý các tập hợp thông tin lớn hơn.
Kiểu Array (Mảng)
Định nghĩa: Một mảng (Array) là một tập hợp có thứ tự của các cặp khóa-giá trị (key-value pairs). Nó giống như một "hộp" có thể chứa nhiều thứ, và mỗi thứ trong hộp đó đều có một "nhãn" (khóa) để bạn có thể tìm thấy nó.
- Khóa (Key): Có thể là số nguyên (tự động hoặc do bạn định nghĩa) hoặc chuỗi ký tự.
- Giá trị (Value): Có thể là bất kỳ kiểu dữ liệu nào khác, bao gồm cả các mảng khác.
Đặc điểm:
- Mảng chỉ mục (Indexed Arrays): Đây là loại mảng phổ biến nhất, nơi các khóa tự động được gán là các số nguyên bắt đầu từ
0
và tăng dần lên.
<?php $fruits = ["Apple", "Banana", "Cherry"]; echo $fruits[0]; // Output: Apple ?>
Mảng kết hợp (Associative Arrays): Trong loại mảng này, bạn tự định nghĩa khóa bằng các chuỗi ký tự, giúp mảng có ý nghĩa hơn khi truy cập dữ liệu.
<?php $person = ["name" => "Alice", "age" => 30, "city" => "New York"]; echo $person["name"]; // Output: Alice ?>
Mảng đa chiều (Multidimensional Arrays): Là mảng chứa các mảng khác bên trong nó. Điều này cho phép bạn tạo ra các cấu trúc dữ liệu phức tạp hơn, như bảng hoặc lưới.
<?php $students = [ ["John", 20, "Math"], ["Jane", 22, "Science"] ]; echo $students[0][0]; // Output: John ?>
Cách khai báo: Có hai cách chính để khai báo mảng trong PHP:
- Sử dụng hàm
array()
: Đây là cú pháp truyền thống.
<?php $colors = array("Red", "Green", "Blue"); $config = array("host" => "localhost", "user" => "root"); ?>
Sử dụng cú pháp ngắn []
: Đây là cú pháp hiện đại và được khuyến nghị từ PHP 5.4 trở đi, giúp code ngắn gọn hơn.
<?php $numbers = [1, 2, 3, 4, 5]; $userData = ["id" => 1, "name" => "Bob", "email" => "[email protected]"]; ?>
Các phép toán/hàm phổ biến với mảng:
count()
: Đếm số phần tử trong mảng.- Duyệt mảng (
foreach
): Cách phổ biến nhất để lặp qua tất cả các phần tử trong mảng. - Thêm/xóa phần tử:
- Thêm:
$array[] = $value;
(cho mảng chỉ mục) hoặc$array['key'] = $value;
- Xóa:
unset($array['key']);
hoặcunset($array[index]);
- Thêm:
Ví dụ Code:
<?php echo "<h2>1. Kiểu Array (Mảng)</h2>"; // Mảng chỉ mục (Indexed Array) $fruits = ["Apple", "Banana", "Cherry", "Date"]; echo "<h3>Mảng chỉ mục:</h3>"; echo "Các loại trái cây: "; echo $fruits[0] . ", " . $fruits[1] . ", " . $fruits[2] . ".<br>"; echo "Số lượng trái cây: " . count($fruits) . "<br>"; // Thêm phần tử vào mảng chỉ mục $fruits[] = "Elderberry"; // Thêm vào cuối echo "Sau khi thêm: " . $fruits[4] . "<br>"; // Output: Elderberry // Duyệt mảng chỉ mục echo "Danh sách trái cây (dùng foreach):<br>"; foreach ($fruits as $fruit) { echo "- " . $fruit . "<br>"; } // Mảng kết hợp (Associative Array) $student = [ "name" => "Nguyễn Văn An", "age" => 20, "major" => "Khoa học Máy tính", "email" => "[email protected]" ]; echo "<h3>Mảng kết hợp:</h3>"; echo "Tên sinh viên: " . $student["name"] . "<br>"; echo "Tuổi: " . $student["age"] . "<br>"; // Thêm/Cập nhật phần tử trong mảng kết hợp $student["gpa"] = 3.8; // Thêm khóa mới $student["age"] = 21; // Cập nhật giá trị echo "GPA mới: " . $student["gpa"] . "<br>"; echo "Tuổi cập nhật: " . $student["age"] . "<br>"; // Duyệt mảng kết hợp echo "Thông tin sinh viên (dùng foreach với key và value):<br>"; foreach ($student as $key => $value) { echo "- " . $key . ": " . $value . "<br>"; } // Xóa phần tử unset($student["email"]); echo "Sau khi xóa email: " . (isset($student["email"]) ? "Có email" : "Không có email") . "<br>"; // Mảng đa chiều (Multidimensional Array) $products = [ ["id" => 1, "name" => "Laptop", "price" => 1500, "stock" => 10], ["id" => 2, "name" => "Mouse", "price" => 25, "stock" => 50], ["id" => 3, "name" => "Keyboard", "price" => 75, "stock" => 30] ]; echo "<h3>Mảng đa chiều:</h3>"; echo "Tên sản phẩm đầu tiên: " . $products[0]["name"] . "<br>"; echo "Giá sản phẩm thứ hai: " . $products[1]["price"] . "<br>"; // Duyệt mảng đa chiều echo "Danh sách sản phẩm:<br>"; foreach ($products as $product) { echo "ID: " . $product["id"] . ", Tên: " . $product["name"] . ", Giá: " . $product["price"] . ", Tồn kho: " . $product["stock"] . "<br>"; } ?>
Kiểu Object (Đối tượng)
-
Định nghĩa: Một đối tượng (Object) là một thể hiện (instance) của một lớp (Class). Trong lập trình hướng đối tượng (OOP), các lớp là bản thiết kế để tạo ra các đối tượng. Một đối tượng có thể chứa cả:
- Dữ liệu (thuộc tính/properties): Các biến lưu trữ thông tin về đối tượng đó.
- Các chức năng (phương thức/methods): Các hàm thực hiện các hành động liên quan đến đối tượng đó.
- Hãy hình dung một Class như là bản vẽ kỹ thuật của một chiếc xe hơi, còn một Object là chính chiếc xe hơi cụ thể được sản xuất từ bản vẽ đó (ví dụ: chiếc Toyota Camry màu đỏ của bạn).
-
Khái niệm cơ bản:
- Class: Là một khuôn mẫu, định nghĩa cấu trúc và hành vi chung cho một loại đối tượng. Nó không chiếm bộ nhớ cho dữ liệu cụ thể.
- Object: Là một thực thể cụ thể được tạo ra từ một class. Mỗi object có bộ dữ liệu riêng của nó dựa trên các thuộc tính được định nghĩa trong class.
-
Cách khai báo/sử dụng: Bạn tạo một đối tượng mới từ một lớp bằng từ khóa
new
. Sau khi tạo, bạn có thể truy cập các thuộc tính và phương thức của nó bằng toán tử mũi tên->
. -
Ví dụ Code: (Giới thiệu cơ bản, không đi sâu vào OOP phức tạp)
<?php echo "<h2>2. Kiểu Object (Đối tượng)</h2>"; // Định nghĩa một Class (bản thiết kế) class Book { // Thuộc tính (dữ liệu) của đối tượng Book public $title; public $author; public $publicationYear; // Phương thức (chức năng) của đối tượng Book // Phương thức khởi tạo __construct được gọi tự động khi tạo đối tượng mới public function __construct($title, $author, $year) { $this->title = $title; // Gán giá trị cho thuộc tính của đối tượng hiện tại $this->author = $author; $this->publicationYear = $year; } // Phương thức để hiển thị thông tin sách public function getBookInfo() { return "Sách: \"" . $this->title . "\" của tác giả " . $this->author . ", xuất bản năm " . $this->publicationYear . "."; } } // Tạo các đối tượng (instance) từ Class Book $book1 = new Book("Nhà Giả Kim", "Paulo Coelho", 1988); $book2 = new Book("Hoàng Tử Bé", "Antoine de Saint-Exupéry", 1943); // Truy cập thuộc tính của đối tượng echo "Tiêu đề sách 1: " . $book1->title . "<br>"; echo "Tác giả sách 2: " . $book2->author . "<br>"; // Gọi phương thức của đối tượng echo $book1->getBookInfo() . "<br>"; echo $book2->getBookInfo() . "<br>"; // Kiểm tra kiểu dữ liệu của biến đối tượng echo "Kiểu của \$book1: " . gettype($book1) . "<br>"; ?>
Hàm kiểm tra và ép kiểu dữ liệu trong PHP
Trong PHP, do tính chất định kiểu động, việc kiểm tra và ép kiểu dữ liệu trở nên rất quan trọng. Nó giúp bạn đảm bảo dữ liệu được xử lý đúng cách, tránh các lỗi logic tiềm ẩn và viết code mạnh mẽ, đáng tin cậy hơn.
Hàm kiểm tra kiểu dữ liệu
PHP cung cấp một bộ các hàm tiện ích để bạn kiểm tra kiểu dữ liệu hiện tại của một biến. Những hàm này rất hữu ích cho việc xác thực dữ liệu đầu vào hoặc khi bạn cần biết chính xác loại dữ liệu mình đang làm việc.
-
gettype()
: Hàm này trả về tên kiểu dữ liệu của biến dưới dạng một chuỗi. Nó có thể trả về các giá trị như"integer"
,"double"
(cho float),"string"
,"boolean"
,"array"
,"object"
,"resource"
,"NULL"
,"unknown type"
.
<?php $soNguyen = 100; $chuoiText = "Hello"; $mangDuLieu = [1, 2, 3]; $giaTriNull = null; echo "Kiểu của \$soNguyen: " . gettype($soNguyen) . "<br>"; // Output: integer echo "Kiểu của \$chuoiText: " . gettype($chuoiText) . "<br>"; // Output: string echo "Kiểu của \$mangDuLieu: " . gettype($mangDuLieu) . "<br>"; // Output: array echo "Kiểu của \$giaTriNull: " . gettype($giaTriNull) . "<br>"; // Output: NULL ?>
is_int()
, is_float()
, is_string()
, is_bool()
, is_array()
, is_object()
, is_null()
, is_resource()
: Đây là một nhóm các hàm is_*()
chuyên biệt, mỗi hàm dùng để kiểm tra xem một biến có phải thuộc một kiểu dữ liệu cụ thể nào đó hay không. Chúng trả về true
nếu đúng và false
nếu sai.
<?php $so = 123; $chu = "abc"; $coKhong = true; $list = [10, 20]; echo "is_int(\$so): " . (is_int($so) ? "True" : "False") . "<br>"; // Output: True echo "is_string(\$so): " . (is_string($so) ? "True" : "False") . "<br>"; // Output: False echo "is_string(\$chu): " . (is_string($chu) ? "True" : "False") . "<br>"; // Output: True echo "is_bool(\$coKhong): " . (is_bool($coKhong) ? "True" : "False") . "<br>"; // Output: True echo "is_array(\$list): " . (is_array($list) ? "True" : "False") . "<br>"; // Output: True $chuaDinhNghia; echo "is_null(\$chuaDinhNghia): " . (is_null($chuaDinhNghia) ? "True" : "False") . "<br>"; // Output: True ?>
isset()
: Hàm này kiểm tra xem một biến có tồn tại và có giá trị khác NULL
hay không. Đây là hàm rất quan trọng để tránh lỗi "Undefined variable" (biến chưa được định nghĩa).
<?php $ten = "Lan"; $diaChi = null; // Gán rõ ràng là null // $dienThoai; // Biến chưa được định nghĩa echo "isset(\$ten): " . (isset($ten) ? "True" : "False") . "<br>"; // Output: True echo "isset(\$diaChi): " . (isset($diaChi) ? "True" : "False") . "<br>"; // Output: False (vì là NULL) echo "isset(\$dienThoai): " . (isset($dienThoai) ? "True" : "False") . "<br>"; // Output: False (vì chưa định nghĩa) ?>
empty()
: Hàm này kiểm tra xem một biến có rỗng hay không. Một biến được coi là "rỗng" nếu nó tương đương với false
trong ngữ cảnh boolean.
Các giá trị mà empty()
coi là true
(rỗng):
""
(chuỗi rỗng)0
(số nguyên 0)0.0
(số thực 0.0)"0"
(chuỗi "0")null
false
[]
(một mảng rỗng)- Biến chưa được định nghĩa (cũng sẽ được coi là rỗng và không gây lỗi
Undefined variable
)
<?php $chuoiRong = ""; $soZero = 0; $giaTriFalse = false; $mangRong = []; $bienNull = null; $bienChuaKhaiBao; // Biến chưa được định nghĩa echo "empty(\$chuoiRong): " . (empty($chuoiRong) ? "True" : "False") . "<br>"; // Output: True echo "empty(\$soZero): " . (empty($soZero) ? "True" : "False") . "<br>"; // Output: True echo "empty(\$giaTriFalse): " . (empty($giaTriFalse) ? "True" : "False") . "<br>"; // Output: True echo "empty(\$mangRong): " . (empty($mangRong) ? "True" : "False") . "<br>"; // Output: True echo "empty(\$bienNull): " . (empty($bienNull) ? "True" : "False") . "<br>"; // Output: True echo "empty(\$bienChuaKhaiBao): " . (empty($bienChuaKhaiBao) ? "True" : "False") . "<br>"; // Output: True (không gây lỗi) $chuoiKhongRong = "Hello"; echo "empty(\$chuoiKhongRong): " . (empty($chuoiKhongRong) ? "True" : "False") . "<br>"; // Output: False ?>
Lưu ý quan trọng về ép kiểu:
- PHP cũng thực hiện ép kiểu ngầm định (type juggling) trong nhiều trường hợp (ví dụ: khi bạn thực hiện phép cộng giữa một số và một chuỗi số, PHP sẽ tự động chuyển chuỗi thành số).
- Tuy nhiên, việc ép kiểu tường minh sẽ làm cho code của bạn rõ ràng hơn về ý định của bạn và an toàn hơn, giúp bạn kiểm soát tốt hơn hành vi của chương trình và tránh được những kết quả không mong muốn do PHP tự động suy luận.
Kết bài
Mình đã cùng nhau đi tìm hiểu các loại dữ liệu khác nhau mà PHP hỗ trợ – từ những kiểu cơ bản (scalar) như số nguyên, số thực, chuỗi ký tự và boolean, cho đến các kiểu phức hợp (compound) mạnh mẽ như mảng và đối tượng, cùng với hai kiểu đặc biệt là null
và resource
. Mỗi loại dữ liệu đều có vai trò và cách hoạt động riêng biệt, là nền tảng để bạn xây dựng mọi logic và chức năng trong ứng dụng của mình.
Việc hiểu rõ từng loại dữ liệu không chỉ giúp bạn lưu trữ thông tin hiệu quả mà còn là chìa khóa để thao tác và xử lý dữ liệu một cách chính xác. Đặc biệt, với tính chất định kiểu động của PHP, việc nắm vững các hàm kiểm tra kiểu (gettype()
, is_int()
, isset()
, empty()
) và biết cách thực hiện ép kiểu tường minh ((int)
, (string)
, v.v.) sẽ là công cụ vô giá. Chúng giúp bạn kiểm soát dòng chảy của dữ liệu, ngăn chặn những lỗi không mong muốn do PHP tự động chuyển đổi kiểu, và cuối cùng là viết ra những đoạn code mạnh mẽ, dễ bảo trì và an toàn hơn.