Tìm hiểu các loại dữ liệu trong PHP

PHP Tutorial | by Học PHP

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ữ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ới 3 nhưng không thể cộng 5 với "Hello".
    • 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!)

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ặc unset($array[index]);

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ệtnullresource. 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.

Bài viết liên quan