Biến, Hằng và Các Kiểu Dữ Liệu trong PHP: Nền Tảng Cốt Lõi
Lập trình PHP

Biến, Hằng và Các Kiểu Dữ Liệu trong PHP: Nền Tảng Cốt Lõi

<?xml encoding="utf-8" ?>

Chào mừng bạn đến với bài học thứ tư trong series PHP của TheGioiPHP.com! Ở bài trước, chúng ta đã làm quen với cú pháp PHP cơ bản, viết được chương trình "Hello, World!" và hiểu về comment. Đó là những bước đi đầu tiên tuyệt vời.

Hôm nay, chúng ta sẽ đào sâu vào một trong những khái niệm nền tảng và quan trọng nhất của mọi ngôn ngữ lập trình: cách lưu trữ, quản lý và phân loại dữ liệu. Cụ thể, chúng ta sẽ cùng nhau tìm hiểu chi tiết về Biến (Variables)Hằng (Constants) và Các kiểu dữ liệu trong PHP.

Việc nắm vững kiến thức trong bài viết này sẽ giúp bạn hiểu được cách chương trình "ghi nhớ" thông tin, từ đó xây dựng nên những logic phức tạp và các ứng dụng hữu ích. Hãy cùng bắt đầu nhé!

Phần 1: Tìm hiểu sâu hơn về Biến (Variables) trong PHP

Ở bài trước, chúng ta đã biết biến trong PHP là gì - nó giống như một chiếc hộp có nhãn để chứa dữ liệu. Mọi biến đều bắt đầu bằng ký tự $ và có thể được gán giá trị bằng toán tử =.

<?php
    // $tenWebsite là tên biến (nhãn hộp)
    // "TheGioiPHP.com" là giá trị (thứ chứa trong hộp)
    $tenWebsite = "TheGioiPHP.com";
?>

Tuy nhiên, câu chuyện về biến không chỉ dừng lại ở đó. Một khái niệm cực kỳ quan trọng mà bạn cần nắm vững là Phạm vi của biến (Variable Scope).

Phạm vi của biến (Variable Scope): Biến "sống" ở đâu?

Phạm vi của biến quyết định nơi mà bạn có thể truy cập và sử dụng một biến trong chương trình của mình. Trong PHP, có ba phạm vi chính:

1. Phạm vi cục bộ (Local Scope)

Một biến được khai báo bên trong một hàm (chúng ta sẽ học về hàm ở các bài sau) được gọi là biến cục bộ. Nó chỉ có thể được truy cập và sử dụng bên trong chính hàm đó mà thôi.

Hãy xem ví dụ:

<?php
function loiChaoCucBo() {
    $loiNhan = "Xin chào từ bên trong hàm!"; // Đây là biến cục bộ
    echo $loiNhan;
}

loiChaoCucBo(); // Dòng này sẽ in ra: "Xin chào từ bên trong hàm!"

// Cố gắng truy cập biến $loiNhan từ bên ngoài hàm sẽ gây ra lỗi!
echo $loiNhan; // Lỗi: Undefined variable '$loiNhan'
?>

Điều này giúp tránh xung đột tên biến giữa các phần khác nhau của chương trình.

2. Phạm vi toàn cục (Global Scope)

Ngược lại, một biến được khai báo bên ngoài tất cả các hàm được gọi là biến toàn cục. Nó có thể được truy cập từ bất cứ đâu trong file, ngoại trừ bên trong các hàm.

Làm thế nào để truy cập biến toàn cục từ bên trong một hàm? Để làm điều này, bạn cần sử dụng từ khóa global.

<?php
$tenWebsite = "TheGioiPHP.com"; // Đây là biến toàn cục

function hienThiTenWebsite() {
    // Sử dụng từ khóa 'global' để báo cho hàm biết
    // chúng ta muốn dùng biến $tenWebsite từ bên ngoài
    global $tenWebsite;

    echo "Chào mừng bạn đến với " . $tenWebsite;
}

hienThiTenWebsite(); // Dòng này sẽ in ra: "Chào mừng bạn đến với TheGioiPHP.com"
?>

3. Phạm vi tĩnh (Static Scope)

Thông thường, khi một hàm thực thi xong, tất cả các biến cục bộ của nó sẽ bị xóa đi. Tuy nhiên, đôi khi bạn muốn một biến cục bộ không bị xóa và giữ lại giá trị của nó sau mỗi lần gọi hàm. Đó là lúc từ khóa static phát huy tác dụng.

Hãy xem ví dụ về một bộ đếm đơn giản:

<?php
function demSoLanGoiHam() {
    static $soLanGoi = 0; // Khai báo biến static, chỉ khởi tạo lần đầu
    $soLanGoi++;
    echo "Hàm này đã được gọi " . $soLanGoi . " lần.<br>";
}

demSoLanGoiHam(); // In ra: Hàm này đã được gọi 1 lần.
demSoLanGoiHam(); // In ra: Hàm này đã được gọi 2 lần.
demSoLanGoiHam(); // In ra: Hàm này đã được gọi 3 lần.
?>

Như bạn thấy, biến $soLanGoi vẫn "nhớ" giá trị của nó qua các lần gọi hàm khác nhau.

Phần 2: Hằng số (Constants) - Những giá trị bất biến

Chúng ta đã có biến để lưu các giá trị có thể thay đổi. Nhưng nếu bạn có một giá trị mà bạn biết chắc rằng nó sẽ không bao giờ và không được phép thay đổi trong suốt chương trình thì sao? Ví dụ như số PI (3.14), tên một cấu hình database, hoặc một thông điệp hệ thống.

Đó chính là lúc chúng ta cần đến Hằng số trong PHP.

Hằng số trong PHP là gì?

Hằng số (Constant) là một định danh (tên) cho một giá trị đơn giản. Đúng như tên gọi, giá trị của hằng số không thể bị thay đổi sau khi đã được định nghĩa.

Tại sao và khi nào nên dùng hằng trong PHP?

  • An toàn: Ngăn chặn việc vô tình thay đổi các giá trị quan trọng.
  • Dễ bảo trì: Nếu bạn cần thay đổi một giá trị được dùng ở nhiều nơi (ví dụ: số lượng sản phẩm tối đa trên một trang), bạn chỉ cần thay đổi ở nơi định nghĩa hằng số thay vì phải tìm và sửa ở 20 chỗ khác nhau.
  • Dễ đọc: Giúp code của bạn dễ hiểu hơn. Ví dụ, MAX_LOGIN_ATTEMPTS sẽ dễ hiểu hơn nhiều so với con số 5.

Cách định nghĩa hằng trong PHP

Có hai cách để định nghĩa hằng trong PHP:

1. Sử dụng hàm define()

Đây là cách truyền thống và phổ biến nhất.

Cú pháp: define(string $name, mixed $value, bool $case_insensitive = false)

  • $name: Tên của hằng số (viết hoa theo quy ước).
  • $value: Giá trị của hằng số.
  • $case_insensitive: Tham số không bắt buộc. Nếu đặt là true, hằng số sẽ không phân biệt chữ hoa chữ thường (không khuyến khích).
<?php
// Định nghĩa hằng số cho số PI
define("SO_PI", 3.14159);

// Định nghĩa hằng cho tên website
define("TEN_WEBSITE", "TheGioiPHP.com");

// Sử dụng hằng số
echo "Giá trị của PI là: " . SO_PI;
echo "<br>";
echo "Chào mừng đến với " . TEN_WEBSITE;

// Cố gắng thay đổi giá trị của hằng sẽ gây ra lỗi!
// define("SO_PI", 3.14); // Sẽ có cảnh báo lỗi
?>

2. Sử dụng từ khóa const

Kể từ PHP 5.3, bạn có thể sử dụng từ khóa const để khai báo hằng.

<?php
const SO_PI = 3.14159;
const TEN_WEBSITE = "TheGioiPHP.com";

echo "Giá trị của PI là: " . SO_PI;
?>

Sự khác nhau giữa const và define()?

  • define() là một hàm, nó được thực thi lúc chạy (runtime). const là một cấu trúc ngôn ngữ, nó được định nghĩa lúc biên dịch (compile time), do đó nhanh hơn một chút.
  • define() có thể được sử dụng bên trong các cấu trúc điều khiển (như if-else), còn const thì không.
  • const luôn phân biệt chữ hoa chữ thường.

Lời khuyên: Nếu bạn đang khai báo hằng số ở phạm vi toàn cục và giá trị của nó là cố định, hãy ưu tiên dùng const vì nó rõ ràng và hiệu năng tốt hơn.

Sự khác nhau giữa Biến và Hằng trong PHP

Tiêu chí Biến (Variable) Hằng (Constant)
Ký hiệu bắt đầu Bắt đầu bằng $ Không có ký hiệu đặc biệt
Khả năng thay đổi Giá trị có thể thay đổi Giá trị không thể thay đổi
Cách định nghĩa $ten_bien = gia_tri; define() hoặc const
Quy ước đặt tên Chữ thường, camelCase Chữ hoa, dấu gạch dưới
Phạm vi Cục bộ, toàn cục, tĩnh Luôn là toàn cục

Phần 3: Các kiểu dữ liệu trong PHP

PHP có những kiểu dữ liệu nào? Đây là câu hỏi rất quan trọng. Kiểu dữ liệu xác định loại thông tin mà một biến hoặc hằng có thể lưu trữ. Việc hiểu rõ chúng giúp bạn xử lý và tính toán một cách chính xác.

PHP hỗ trợ 8 kiểu dữ liệu nguyên thủy.

Kiểu dữ liệu vô hướng (Scalar Types)

Đây là các kiểu dữ liệu đơn giản nhất, chỉ chứa một giá trị duy nhất.

1. String (Chuỗi ký tự)

Dùng để lưu trữ văn bản. Một chuỗi có thể được đặt trong dấu nháy đơn (') hoặc nháy kép (").

  • Nháy đơn ('): Hiển thị chuỗi đúng như những gì bạn gõ. Nó không xử lý biến bên trong.
  • Nháy kép ("): Sẽ tìm và thay thế tên biến bên trong chuỗi bằng giá trị của nó.
<?php
$ten = "PHP";

echo 'Học lập trình $ten'; // Kết quả: Học lập trình $ten
echo "<br>";
echo "Học lập trình $ten"; // Kết quả: Học lập trình PHP
?>

2. Integer (Số nguyên)

Dùng để lưu trữ các số không có phần thập phân, có thể là số dương, số âm hoặc số 0 (..., -2, -1, 0, 1, 2, ...).

<?php
$soLuong = 100;
$nhietDo = -15;
?>

3. Float / Double (Số thực)

Dùng để lưu trữ các số có phần thập phân.

<?php
$giaTien = 19.99;
$soPI = 3.14159;
?>

4. Boolean (Luận lý)

Đây là kiểu dữ liệu đơn giản nhất, chỉ có hai giá trị: true (đúng) hoặc false (sai). Nó thường được dùng trong các câu lệnh điều kiện để kiểm tra một mệnh đề nào đó.

<?php
$daDangNhap = true;
$laAdmin = false;
?>

Kiểu dữ liệu phức hợp (Compound Types)

5. Array (Mảng)

Dùng để lưu trữ một tập hợp nhiều giá trị trong một biến duy nhất. Mảng là một kiểu dữ liệu cực kỳ mạnh mẽ và chúng ta sẽ có một bài viết riêng để tìm hiểu sâu về nó.

<?php
$danhSachTraiCay = array("Táo", "Cam", "Xoài");
?>

6. Object (Đối tượng)

Dùng để lưu trữ một thực thể của một lớp (class). Đây là khái niệm cốt lõi của Lập trình Hướng đối tượng (OOP) và sẽ được tìm hiểu trong các cụm chủ đề nâng cao.

Kiểu dữ liệu đặc biệt (Special Types)

7. NULL

NULL là một kiểu dữ liệu đặc biệt, chỉ có một giá trị duy nhất: NULL. Nó biểu thị rằng một biến không có giá trị nào cả.

<?php
$bienRong = null;
?>

8. Resource (Tài nguyên)

Đây là một kiểu dữ liệu đặc biệt, không phải là một giá trị thực tế mà là một tham chiếu đến một tài nguyên bên ngoài (ví dụ: kết nối đến database, một file đang mở,...).

Làm thế nào để kiểm tra kiểu dữ liệu của một biến?

Trong quá trình lập trình và đặc biệt là gỡ lỗi, bạn sẽ thường xuyên cần biết một biến đang lưu trữ kiểu dữ liệu gì. PHP cung cấp hai hàm rất hữu ích cho việc này.

1. Hàm var_dump()

Đây là người bạn thân nhất của mọi lập trình viên PHP. Hàm var_dump() sẽ in ra thông tin chi tiết về một hoặc nhiều biến, bao gồm cả kiểu dữ liệu và giá trị của nó.

<?php
$ten = "TheGioiPHP.com";
$soBaiViet = 150;
$isOnline = true;
$danhSach = array("Táo", "Cam");
$khongCoGi = null;

var_dump($ten);
echo "<br>";
var_dump($soBaiViet);
echo "<br>";
var_dump($isOnline);
echo "<br>";
var_dump($danhSach);
echo "<br>";
var_dump($khongCoGi);
?>

chèn hình`
(Mô tả hình: Kết quả của các lệnh var_dump() trên trình duyệt, hiển thị rõ kiểu dữ liệu và giá trị)

2. Hàm gettype()

Hàm này sẽ trả về tên kiểu dữ liệu của biến dưới dạng một chuỗi.

<?php
$ten = "TheGioiPHP.com";
echo gettype($ten); // Kết quả: string
?>

Kết luận

Chúng ta vừa cùng nhau khám phá ba khái niệm nền tảng: BiếnHằng và Các kiểu dữ liệu. Đây là những kiến thức cốt lõi mà bạn sẽ sử dụng hàng ngày, hàng giờ khi viết code PHP.

  • Biến linh hoạt, có thể thay đổi giá trị và có các phạm vi hoạt động khác nhau.
  • Hằng bất biến, an toàn, dùng cho các giá trị không đổi.
  • Kiểu dữ liệu giúp PHP hiểu và xử lý thông tin một cách chính xác.

Đừng chỉ đọc, hãy mở trình soạn thảo code của bạn lên, thử khai báo các loại biến, định nghĩa hằng số và dùng var_dump() để xem chúng hoạt động như thế nào. Việc thực hành thường xuyên là cách tốt nhất để biến kiến thức thành kỹ năng.

Trong bài học tiếp theo, chúng ta sẽ tìm hiểu về "Các toán tử trong PHP" để bắt đầu thực hiện các phép tính và so sánh với những dữ liệu mà chúng ta đã học cách lưu trữ hôm nay.

Kelvin Zeng

Senior Website Developer

👨‍💻 Senior PHP Developer, hiện đảm nhận vai trò Techlead. Tôi có kinh nghiệm làm việc trong môi trường công ty Nhật Bản, từng tham gia thiết kế tài liệu kỹ thuật (Basic Design, Detail Design) và lập kế hoạch dự án với vai trò như một Project Lead. Trong sự nghiệp, tôi đã tham gia xây dựng và triển khai nhiều hệ thống E-commerce cũng như làm việc với nhiều framework khác nhau. Ngoài lập trình, tôi quan tâm đến SEO, automation và marketing, đặc biệt yêu thích việc phát triển các công cụ giúp tối ưu công việc. Tôi luôn sẵn sàng chia sẻ kiến thức, đồng hành cùng đồng đội để nâng cao chuyên môn và đạt được những mục tiêu lớn hơn.