Cách sử dụng biến trong PHP

PHP Tutorial | by Học PHP

Trong PHP, một trong những ngôn ngữ lập trình web phổ biến nhất, biến đóng vai trò cốt lõi. Chúng giống như những chiếc hộp đa năng, cho phép chúng ta lưu trữ và thao tác với mọi loại dữ liệu một cách cực kỳ linh hoạt. Khác với nhiều ngôn ngữ khác, PHP có một đặc điểm thú vị: bạn không cần phải khai báo trước chiếc hộp này sẽ đựng loại "đồ vật" gì (số, chữ, hay danh sách). PHP đủ thông minh để tự mình nhận ra!

Nếu bạn đang bắt đầu hành trình với PHP, hay chỉ đơn giản là muốn củng cố lại kiến thức nền tảng, việc hiểu rõ cách khai báo và sử dụng biến là bước đi đầu tiên và quan trọng nhất. Nó giống như việc bạn học cách mở chiếc hộp, đặt đồ vào và lấy đồ ra một cách hiệu quả vậy. Trong bài viết này, mình sẽ cùng nhau tìm hiểu mọi khía cạnh của biến trong PHP, từ những quy tắc đặt tên nhỏ nhất đến cách chúng hoạt động trong các tình huống phức tạp. Hãy cùng bắt đầu nhé!

Biến là gì?

Để dễ hình dung, bạn có thể nghĩ biến trong lập trình như những chiếc hộp rỗng có dán nhãn mà chúng ta dùng để cất giữ thông tin. Mỗi chiếc hộp có một cái tên riêng (cái nhãn) để bạn dễ dàng tìm lại và biết bên trong chứa gì.

Cụ thể hơn:

  • Biến là một vùng nhớ được đặt tên: Khi bạn tạo một biến, bạn đang yêu cầu máy tính "dành ra" một chỗ trong bộ nhớ của nó và đặt cho chỗ đó một cái tên. Cái tên này giúp bạn tham chiếu đến dữ liệu đó sau này.
  • Dùng để lưu trữ dữ liệu: Bên trong chiếc hộp này, bạn có thể đặt bất kỳ loại dữ liệu nào: một con số (như tuổi của bạn), một đoạn văn bản (như tên của bạn), một giá trị đúng/sai (như trạng thái đăng nhập), hay thậm chí là cả một danh sách các món đồ.
  • Dữ liệu này có thể thay đổi: Đúng như việc bạn có thể lấy đồ này ra và đặt đồ khác vào chiếc hộp, giá trị của một biến có thể được thay đổi bất cứ lúc nào trong quá trình chương trình chạy.

Tầm quan trọng của biến trong lập trình

Biến không chỉ là một khái niệm, chúng là xương sống của mọi chương trình máy tính. Chúng ta không thể viết bất kỳ phần mềm hữu ích nào mà không có biến, bởi vì:

  • Lưu trữ dữ liệu tạm thời: Biến cho phép chương trình tạm thời "ghi nhớ" thông tin cần thiết để xử lý, ví dụ như dữ liệu mà người dùng nhập vào từ một biểu mẫu, kết quả của một phép tính phức tạp, hay dữ liệu được lấy từ cơ sở dữ liệu.
  • Quản lý và thao tác dữ liệu: Khi dữ liệu đã nằm trong một biến, chúng ta có thể dễ dàng thực hiện các phép tính toán (cộng, trừ, nhân, chia), so sánh, kết hợp các đoạn văn bản, hoặc biến đổi dữ liệu theo nhiều cách khác nhau tùy theo logic của chương trình.
  • Tái sử dụng code: Thay vì phải gõ đi gõ lại cùng một giá trị nhiều lần, bạn chỉ cần lưu nó vào một biến và sử dụng tên biến đó ở bất cứ đâu bạn cần. Điều này giúp code gọn gàng hơn, dễ đọc hơn và dễ bảo trì hơn rất nhiều.
  • Tạo ra chương trình động: Nhờ có biến, chương trình của chúng ta có thể phản ứng linh hoạt với các dữ liệu đầu vào khác nhau. Điều này cho phép chúng ta xây dựng các ứng dụng tương tác, cá nhân hóa trải nghiệm người dùng, thay vì chỉ làm một việc cố định mỗi khi chạy.

Đặc điểm của biến trong PHP

PHP có một số đặc điểm riêng biệt về biến khiến nó trở nên rất linh hoạt và thân thiện với người học:

  • Ngôn ngữ kiểu động (Dynamically Typed): Đây là một trong những đặc điểm nổi bật nhất của PHP và làm cho nó khác biệt so với một số ngôn ngữ khác như Java hay C++. "Kiểu động" có nghĩa là khi bạn khai báo một biến, bạn không cần phải chỉ rõ nó sẽ chứa loại dữ liệu gì (ví dụ: số nguyên int, chuỗi string, số thực float). PHP sẽ tự động "đoán" và gán kiểu dữ liệu phù hợp dựa trên giá trị mà bạn gán cho biến đó.

<?php
$soNguyen = 123;       // PHP tự hiểu đây là kiểu số nguyên (integer)
$chuoiKyTu = "Hello";  // PHP tự hiểu đây là kiểu chuỗi (string)
$soThapPhan = 3.14;    // PHP tự hiểu đây là kiểu số thực (float/double)

echo gettype($soNguyen) . "<br>";    // Output: integer
echo gettype($chuoiKyTu) . "<br>";   // Output: string
echo gettype($soThapPhan) . "<br>";  // Output: double

// Bạn có thể thay đổi kiểu dữ liệu của biến bất cứ lúc nào
$soNguyen = "Một trăm hai mươi ba"; // Bây giờ $soNguyen là một chuỗi
echo gettype($soNguyen) . "<br>";    // Output: string
?>

Bắt đầu bằng ký hiệu $: Trong PHP, tất cả các tên biến bắt buộc phải bắt đầu bằng dấu đô la ($). Đây là "dấu hiệu nhận biết" duy nhất và đặc trưng của biến trong PHP, giúp phân biệt chúng với các thành phần khác của ngôn ngữ như hằng số, hàm, hoặc từ khóa.

<?php
$tenNguoiDung = "Alice";      // Đây là một biến hợp lệ
$giaSanPham = 250000;         // Đây là một biến hợp lệ

// tenNguoiDung = "Bob"; // Sẽ báo lỗi cú pháp vì thiếu dấu $
// echo giaSanPham;     // Sẽ báo lỗi "Undefined constant" nếu không có dấu $
?>

Phân biệt chữ hoa chữ thường (Case-Sensitive): Đây là một điểm cực kỳ quan trọng và thường gây nhầm lẫn cho người mới học. PHP coi các tên biến có cách viết hoa/thường khác nhau là những biến hoàn toàn riêng biệt.

<?php
$tenCuaToi = "Mai";    // Biến thứ nhất
$Tencuatoi = "An";     // Biến thứ hai (khác $tenCuaToi)
$TENCUATOI = "Hung";   // Biến thứ ba (khác cả hai biến trên)

echo "Biến \$tenCuaToi: " . $tenCuaToi . "<br>";   // Output: Biến $tenCuaToi: Mai
echo "Biến \$Tencuatoi: " . $Tencuatoi . "<br>";   // Output: Biến $Tencuatoi: An
echo "Biến \$TENCUATOI: " . $TENCUATOI . "<br>";   // Output: Biến $TENCUATOI: Hung

// Nếu bạn cố gắng sử dụng một biến không tồn tại (do sai chính tả hoa/thường):
// echo $tencuatoi; // Sẽ báo lỗi: Undefined variable: tencuatoi
?>

Để tránh những lỗi không đáng có và giúp code dễ đọc hơn, bạn nên chọn một quy ước đặt tên biến (ví dụ: camelCase hoặc snake_case) và luôn tuân thủ nó một cách nhất quán trong toàn bộ dự án của mình.

Khai báo Biến trong PHP

Sau khi hiểu biến là gì, giờ là lúc bạn học cách "tạo ra" chúng trong code PHP của mình. Quá trình này được gọi là khai báo biến.

Quy tắc đặt tên biến

Đặt tên cho biến cũng giống như bạn dán nhãn cho một chiếc hộp vậy. Cái nhãn đó cần phải rõ ràng để bạn biết bên trong chứa gì, và cũng cần tuân theo một vài quy tắc nhất định để máy tính có thể hiểu được.

Trong PHP, các quy tắc đặt tên biến rất quan trọng và bạn phải tuân thủ chúng:

Bắt buộc phải bắt đầu bằng ký hiệu $: Đây là điều kiện tiên quyết và đặc trưng nhất của biến trong PHP. Bất kỳ tên nào không có dấu $ ở đầu sẽ không được PHP nhận diện là một biến.

  • Ví dụ: $hoTen, $emailKhachHang, $tongDonHang.

Ký tự tiếp theo phải là chữ cái (a-z, A-Z) hoặc dấu gạch dưới (_): Sau dấu $ đầu tiên, ký tự thứ hai không được là số. Nó phải là một chữ cái hoặc dấu gạch dưới.

  • Đúng: $ten, $_maSanPham.
  • Sai: $1thongBao (vì bắt đầu bằng số 1 sau dấu $.)

Các ký tự còn lại có thể là chữ cái, số (0-9) hoặc dấu gạch dưới (_): Sau ký tự thứ hai, bạn có thể thoải mái sử dụng chữ cái, số hoặc dấu gạch dưới để hoàn thiện tên biến của mình.

  • Đúng: $tenDangNhap, $soLuong_SP, $version1_0.

Không được chứa khoảng trắng hoặc các ký tự đặc biệt khác (trừ dấu _): Tên biến không được có dấu cách hoặc các ký tự như -, !, @, #, %, ^, &, *, (, ), +, =, {, }, [, ], |, \, ;, :, <, >, ., /, ?, ,. Dấu gạch dưới (_) là ngoại lệ và thường được dùng để phân tách các từ trong tên biến để dễ đọc hơn.

  • Sai: $ten san pham (có khoảng trắng), $dia-chi (có dấu gạch ngang), $email@lienhe (có dấu @).

Tóm tắt các ví dụ:

  • Ví dụ đúng:
<?php
$ten;            // Tên đơn giản
$so_luong;       // Dùng dấu gạch dưới (snake_case)
$giaTriDonHang;  // Dùng camelCase (ký tự đầu tiên của từ thứ hai viết hoa)
$_maKhachHang;  // Bắt đầu bằng dấu gạch dưới
$namSinh1990;    // Chứa số ở cuối
?>

Ví dụ sai (và lý do):

<?php
// $1ten;            // SAI: Bắt đầu bằng số sau dấu $
// $ten san pham;    // SAI: Chứa khoảng trắng
// $email-khachhang; // SAI: Chứa dấu gạch ngang (-)
// $ho@ten;          // SAI: Chứa ký tự đặc biệt (@)
?>

Cách khai báo biến

Trong PHP, việc khai báo biến cực kỳ đơn giản và trực quan. Bạn không cần một từ khóa đặc biệt để khai báo, cũng không cần chỉ rõ kiểu dữ liệu. Tất cả những gì bạn cần làm là gán một giá trị cho biến ngay khi bạn tạo ra nó.

Cú pháp cơ bản:

$tenBien = giaTri;
  • $tenBien: Là tên bạn đã đặt cho biến, tuân thủ các quy tắc trên.
  • =: Đây là toán tử gán. Nó dùng để "đặt" giá trị vào biến.
  • giaTri: Là dữ liệu bạn muốn biến đó lưu trữ. Nó có thể là số, chuỗi, boolean, mảng hoặc bất kỳ loại dữ liệu nào khác.

PHP sẽ tự động xác định kiểu dữ liệu dựa trên giá trị gán: Đây là điểm mạnh của một ngôn ngữ kiểu động như PHP. Khi bạn gán một giá trị, PHP sẽ tự động nhận biết giá trị đó thuộc loại gì (số, chữ, đúng/sai, v.v.) và gán kiểu dữ liệu tương ứng cho biến.

Ví dụ code minh họa:

<?php
// 1. Khai báo biến kiểu số nguyên (Integer)
$soLuong = 100;
echo "Số lượng sản phẩm: " . $soLuong . "<br>"; // Output: Số lượng sản phẩm: 100

// 2. Khai báo biến kiểu số thực (Float/Double)
$giaTien = 19.99;
echo "Giá tiền: " . $giaTien . " USD<br>"; // Output: Giá tiền: 19.99 USD

// 3. Khai báo biến kiểu chuỗi (String)
$tenSanPham = "Laptop Dell XPS";
echo "Tên sản phẩm: " . $tenSanPham . "<br>"; // Output: Tên sản phẩm: Laptop Dell XPS

// 4. Khai báo biến kiểu Boolean
$isAvailable = true; // hoặc false
echo "Sản phẩm có sẵn: " . ($isAvailable ? "Có" : "Không") . "<br>"; // Output: Sản phẩm có sẵn: Có

// 5. Gán lại giá trị cho biến (thay đổi giá trị và kiểu dữ liệu)
$message = "Xin chào"; // Ban đầu là chuỗi
echo "Tin nhắn ban đầu: " . $message . "<br>"; // Output: Tin nhắn ban đầu: Xin chào

$message = 12345; // Bây giờ là số nguyên
echo "Tin nhắn sau khi thay đổi: " . $message . "<br>"; // Output: Tin nhắn sau khi thay đổi: 12345

// 6. Khai báo biến với giá trị NULL (không có giá trị)
$bienTrong = null;
echo "Giá trị của biến rỗng: " . $bienTrong . "<br>"; // Output: Giá trị của biến rỗng: (không có gì được hiển thị vì là NULL)
?>

Trong ví dụ trên, bạn có thể thấy chúng ta không hề khai báo $soLuongint hay $tenSanPhamstring. PHP tự động hiểu và gán kiểu dữ liệu phù hợp dựa trên giá trị bạn cung cấp. Điều này giúp code PHP trở nên linh hoạt và nhanh chóng hơn cho người phát triển.

Sử dụng biến trong PHP

Sau khi đã hiểu cách khai báo và các kiểu dữ liệu của biến, giờ là lúc chúng ta tìm hiểu cách "làm việc" với chúng trong PHP.

Gán giá trị cho biến

Gán giá trị là thao tác cơ bản nhất khi sử dụng biến. Bạn dùng toán tử gán = để "đặt" một giá trị vào biến.

Bạn cũng có thể gán lại giá trị mới cho một biến bất cứ lúc nào trong chương trình. Khi bạn làm vậy, giá trị cũ của biến sẽ bị ghi đè hoàn toàn bởi giá trị mới.

<?php
$diemToan = 8; // Gán giá trị 8 cho biến $diemToan
echo "Điểm toán ban đầu: " . $diemToan . "<br>"; // Output: Điểm toán ban đầu: 8

$diemToan = 9.5; // Gán lại giá trị mới (kiểu dữ liệu cũng thay đổi)
echo "Điểm toán sau khi cập nhật: " . $diemToan . "<br>"; // Output: Điểm toán sau khi cập nhật: 9.5

$tenHocSinh = "Trần Thị C";
echo "Tên học sinh: " . $tenHocSinh . "<br>";

$tenHocSinh = "Lê Văn Dũng"; // Thay đổi tên
echo "Tên học sinh mới: " . $tenHocSinh . "<br>";
?>

Hiển thị giá trị biến

Để xem nội dung của một biến, bạn sử dụng các lệnh sau:

  • echo: Là một cấu trúc ngôn ngữ (không phải hàm) dùng để xuất một hoặc nhiều chuỗi ra màn hình (hoặc trình duyệt khi chạy trên web server). echo nhanh hơn print một chút và có thể nhận nhiều đối số.
  • print: Là một hàm dùng để xuất một chuỗi. print luôn trả về 1, trong khi echo không có giá trị trả về. Trong thực tế, echo được sử dụng phổ biến hơn.
<?php
$tieuDe = "Học PHP cơ bản";
$soBaiHoc = 20;

echo $tieuDe . "<br>"; // Xuất chuỗi
print "Số bài học: " . $soBaiHoc . "<br>"; // Xuất chuỗi và số

// Ví dụ echo với nhiều đối số (phân cách bằng dấu phẩy)
echo "Tên khóa học: ", $tieuDe, " - ", $soBaiHoc, " bài.<br>";
?>

Thao tác với biến (Toán tử)

Biến được dùng để lưu trữ dữ liệu, và các toán tử cho phép bạn thực hiện các phép tính, so sánh, và biến đổi dữ liệu đó.

Phép toán số học: Dùng để thực hiện các phép tính toán học cơ bản với các biến kiểu số.

  • + (cộng)
  • - (trừ)
  • * (nhân)
  • / (chia)
  • % (chia lấy dư - modulo)
<?php
$soA = 15;
$soB = 4;

echo "Cộng: " . ($soA + $soB) . "<br>";     // Output: 19
echo "Trừ: " . ($soA - $soB) . "<br>";     // Output: 11
echo "Nhân: " . ($soA * $soB) . "<br>";     // Output: 60
echo "Chia: " . ($soA / $soB) . "<br>";     // Output: 3.75
echo "Chia lấy dư: " . ($soA % $soB) . "<br>"; // Output: 3 (15 chia 4 được 3, dư 3)
?>

Phép nối chuỗi: Sử dụng dấu chấm (.) để kết hợp (nối) hai hoặc nhiều chuỗi lại với nhau thành một chuỗi mới.

<?php
$ho = "Nguyễn";
$tenDem = "Văn";
$ten = "An";

$hoVaTen = $ho . " " . $tenDem . " " . $ten;
echo "Họ và tên đầy đủ: " . $hoVaTen . "<br>"; // Output: Họ và tên đầy đủ: Nguyễn Văn An

$tinNhan = "Chào mừng bạn" . " đến với " . "PHP!";
echo $tinNhan . "<br>"; // Output: Chào mừng bạn đến với PHP!
?>

Phép so sánh: Dùng để so sánh giá trị của hai biến hoặc biểu thức. Kết quả của phép so sánh luôn là một giá trị Boolean (true hoặc false).

  • == (bằng giá trị): Kiểm tra xem hai giá trị có bằng nhau không.
  • === (bằng giá trị và kiểu): Kiểm tra xem hai giá trị có bằng nhau VÀ cùng kiểu dữ liệu không. (Khuyến khích sử dụng để tránh lỗi tiềm ẩn).
  • != hoặc <> (khác giá trị): Kiểm tra xem hai giá trị có khác nhau không.
  • !== (khác giá trị hoặc kiểu): Kiểm tra xem hai giá trị có khác nhau HOẶC khác kiểu dữ liệu không.
  • > (lớn hơn)
  • < (nhỏ hơn)
  • >= (lớn hơn hoặc bằng)
  • <= (nhỏ hơn hoặc bằng)
<?php
$num1 = 10;
$str1 = "10"; // Đây là một chuỗi, không phải số nguyên
$num2 = 20;

echo "num1 == str1: " . ($num1 == $str1 ? "true" : "false") . "<br>";   // Output: true (Vì giá trị bằng nhau)
echo "num1 === str1: " . ($num1 === $str1 ? "true" : "false") . "<br>"; // Output: false (Vì kiểu dữ liệu khác nhau)

echo "num1 != num2: " . ($num1 != $num2 ? "true" : "false") . "<br>";   // Output: true
echo "num1 < num2: " . ($num1 < $num2 ? "true" : "false") . "<br>";     // Output: true
echo "num1 >= str1: " . ($num1 >= $str1 ? "true" : "false") . "<br>";   // Output: true
?>

Phép toán logic: Kết hợp các biểu thức Boolean để tạo ra các điều kiện phức tạp hơn, thường dùng trong các câu lệnh điều kiện như if, else.

  • && (AND): Kết quả là true nếu TẤT CẢ các điều kiện con đều true.
  • || (OR): Kết quả là true nếu ÍT NHẤT MỘT trong các điều kiện con là true.
  • ! (NOT): Đảo ngược giá trị Boolean (từ true thành false, từ false thành true).
<?php
$daDangNhap = true;
$laAdmin = false;
$coQuyenSua = true;

// Ví dụ AND
if ($daDangNhap && $coQuyenSua) {
    echo "Bạn có quyền truy cập và chỉnh sửa.<br>"; // Sẽ hiển thị
}

// Ví dụ OR
if ($daDangNhap || $laAdmin) {
    echo "Bạn là người dùng hoặc quản trị viên.<br>"; // Sẽ hiển thị
}

// Ví dụ NOT
if (!$laAdmin) {
    echo "Bạn không phải quản trị viên.<br>"; // Sẽ hiển thị
}
?>

Toán tử tăng/giảm: Thay đổi giá trị số của biến thêm hoặc bớt 1 đơn vị.

  • ++ (tăng lên 1)
  • -- (giảm đi 1)

Có hai dạng:

  • Tiền tố (++$bien, --$bien): Thay đổi giá trị biến trước khi sử dụng nó trong biểu thức.
  • Hậu tố ($bien++, $bien--): Sử dụng giá trị hiện tại của biến trước khi thay đổi nó.
<?php
$soLuong = 5;
$soLuong++; // Tương đương $soLuong = $soLuong + 1;
echo "Số lượng sau khi tăng: " . $soLuong . "<br>"; // Output: 6

$count = 10;
$count--; // Tương đương $count = $count - 1;
echo "Count sau khi giảm: " . $count . "<br>"; // Output: 9

// Ví dụ tiền tố và hậu tố
$a = 3;
$b = $a++; // $b = 3 (giá trị của $a trước khi tăng); $a trở thành 4
echo "a = " . $a . ", b = " . $b . "<br>"; // Output: a = 4, b = 3

$x = 3;
$y = ++$x; // $y = 4 (giá trị của $x sau khi tăng); $x trở thành 4
echo "x = " . $x . ", y = " . $y . "<br>"; // Output: x = 4, y = 4
?>

Phạm vi (Scope) của biến

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

  • Biến cục bộ (Local Scope):

    • Mô tả: Biến được khai báo bên trong một hàm chỉ có thể được truy cập từ bên trong hàm đó. Chúng "sống" và "chết" cùng với mỗi lần hàm được gọi.

    • Ví dụ:

<?php
function hienThiTinNhan() {
    $tinNhan = "Chào từ bên trong hàm!"; // Biến cục bộ
    echo $tinNhan . "<br>";
}
hienThiTinNhan(); // Output: Chào từ bên trong hàm!

// Cố gắng truy cập $tinNhan bên ngoài hàm sẽ gây lỗi
// echo $tinNhan; // Lỗi: Undefined variable $tinNhan
?>

Biến toàn cục (Global Scope):

  • Mô tả: Biến được khai báo bên ngoài bất kỳ hàm nào. Chúng có thể được truy cập từ bất kỳ đâu trong tập tin PHP. Tuy nhiên, để truy cập một biến toàn cục từ bên trong một hàm, bạn phải sử dụng từ khóa global hoặc mảng siêu toàn cục $GLOBALS.

  • Ví dụ với global:

<?php
$thongDiepChung = "Đây là thông điệp toàn cục."; // Biến toàn cục

function inThongDiep() {
    global $thongDiepChung; // Khai báo rằng bạn muốn sử dụng biến toàn cục $thongDiepChung
    echo "Từ trong hàm: " . $thongDiepChung . "<br>";
}
inThongDiep();     // Output: Từ trong hàm: Đây là thông điệp toàn cục.
echo "Từ bên ngoài hàm: " . $thongDiepChung . "<br>"; // Output: Từ bên ngoài hàm: Đây là thông điệp toàn cục.
?>

Ví dụ với $GLOBALS (mảng siêu toàn cục): $GLOBALS là một mảng liên kết chứa tất cả các biến toàn cục. Bạn có thể truy cập chúng bằng khóa là tên biến.

<?php
$bienToanCuc1 = 10;
$bienToanCuc2 = 20;

function tinhTongToanCuc() {
    $tong = $GLOBALS['bienToanCuc1'] + $GLOBALS['bienToanCuc2'];
    echo "Tổng các biến toàn cục: " . $tong . "<br>";
}
tinhTongToanCuc(); // Output: Tổng các biến toàn cục: 30
?>

Biến tĩnh (Static Scope):

  • Mô tả: Khi một hàm kết thúc thực thi, tất cả các biến cục bộ của nó thường bị hủy. Tuy nhiên, nếu bạn muốn một biến cục bộ giữ lại giá trị của nó giữa các lần gọi hàm (mà không biến nó thành toàn cục), bạn có thể khai báo nó với từ khóa static. Biến static chỉ được khởi tạo một lần duy nhất.

  • Ví dụ:

<?php
function demSoLanTruyCap() {
    static $soLan = 0; // Biến static, chỉ khởi tạo bằng 0 ở lần gọi đầu tiên
    $soLan++;
    echo "Hàm đã được gọi " . $soLan . " lần.<br>";
}

demSoLanTruyCap(); // Output: Hàm đã được gọi 1 lần.
demSoLanTruyCap(); // Output: Hàm đã được gọi 2 lần. (Giá trị $soLan được giữ lại)
demSoLanTruyCap(); // Output: Hàm đã được gọi 3 lần.
?>

Các hàm hữu ích với biến

PHP cung cấp nhiều hàm tích hợp sẵn để kiểm tra, thao tác và gỡ lỗi liên quan đến biến.

  • var_dump():

    • Mô tả: Hiển thị thông tin chi tiết về biến, bao gồm giá trị, kiểu dữ liệu, và kích thước (đối với chuỗi và mảng). Đây là một công cụ cực kỳ hữu ích cho việc gỡ lỗi (debug).
<?php
$soNgay = 365;
$tenKhoaHoc = "Phát triển Web với PHP";
$danhSachSV = ["An", "Bình", "Chung"];
$giaTriNull = null;

echo "<h3>var_dump() ví dụ:</h3>";
var_dump($soNgay);        // Output: int(365)
echo "<br>";
var_dump($tenKhoaHoc);    // Output: string(24) "Phát triển Web với PHP"
echo "<br>";
var_dump($danhSachSV);    // Output: array(3) { [0]=> string(2) "An" [1]=> string(6) "Bình" [2]=> string(7) "Chung" }
echo "<br>";
var_dump($giaTriNull);    // Output: NULL
echo "<br>";
?>

isset():

  • Mô tả: Kiểm tra xem một biến có được thiết lập (tồn tại)không phải là NULL không. Trả về true hoặc false.
<?php
$emailNguoiDung = "[email protected]";
$diaChi; // Biến chưa được gán giá trị

if (isset($emailNguoiDung)) {
    echo "\$emailNguoiDung đã được thiết lập.<br>"; // Sẽ hiển thị
}

if (isset($diaChi)) {
    echo "\$diaChi đã được thiết lập.<br>"; // KHÔNG hiển thị
} else {
    echo "\$diaChi CHƯA được thiết lập.<br>"; // Sẽ hiển thị
}

$bienNULL = null;
if (isset($bienNULL)) {
    echo "\$bienNULL đã được thiết lập.<br>"; // KHÔNG hiển thị (vì là NULL)
} else {
    echo "\$bienNULL CHƯA được thiết lập (là NULL).<br>"; // Sẽ hiển thị
}
?>

unset():

  • Mô tả: Hủy bỏ (xóa) một hoặc nhiều biến. Sau khi unset(), biến đó sẽ không còn tồn tại và isset() sẽ trả về false.
<?php
$dataSanPham = "Điện thoại Samsung";
echo "Giá trị ban đầu của \$dataSanPham: " . $dataSanPham . "<br>";

unset($dataSanPham); // Hủy bỏ biến $dataSanPham

if (isset($dataSanPham)) {
    echo "\$dataSanPham vẫn tồn tại.<br>";
} else {
    echo "\$dataSanPham đã bị hủy.<br>"; // Sẽ hiển thị
}
?>

empty():

Mô tả: Kiểm tra xem một biến có được coi là "rỗng" không. Một biến được coi là rỗng nếu nó:

  • Chưa được thiết lập (!isset($var)).
  • false.
  • NULL.
  • 0 (số nguyên 0).
  • 0.0 (số thực 0).
  • "0" (chuỗi "0").
  • "" (chuỗi rỗng).
  • Là một mảng rỗng (array()).
<?php
$input1 = 0;
$input2 = "";
$input3 = null;
$input4 = array();
$input5 = "Giá trị";

echo "<h3>empty() ví dụ:</h3>";
echo "Is \$input1 empty? " . (empty($input1) ? "Yes" : "No") . "<br>"; // Yes
echo "Is \$input2 empty? " . (empty($input2) ? "Yes" : "No") . "<br>"; // Yes
echo "Is \$input3 empty? " . (empty($input3) ? "Yes" : "No") . "<br>"; // Yes
echo "Is \$input4 empty? " . (empty($input4) ? "Yes" : "No") . "<br>"; // Yes
echo "Is \$input5 empty? " . (empty($input5) ? "Yes" : "No") . "<br>"; // No
?>

gettype():

  • Mô tả: Trả về kiểu dữ liệu của biến dưới dạng một chuỗi (ví dụ: "integer", "string", "array", "object", "NULL", "resource", "boolean", "double").
<?php
$soLuongHang = 50;
$moTaHang = "Quần áo thời trang";
$trangThai = true;
$danhSachHang = ["Áo", "Quần"];
$bienKhongTonTai = null;

echo "Kiểu của \$soLuongHang: " . gettype($soLuongHang) . "<br>";     // Output: integer
echo "Kiểu của \$moTaHang: " . gettype($moTaHang) . "<br>";         // Output: string
echo "Kiểu của \$trangThai: " . gettype($trangThai) . "<br>";       // Output: boolean
echo "Kiểu của \$danhSachHang: " . gettype($danhSachHang) . "<br>"; // Output: array
echo "Kiểu của \$bienKhongTonTai: " . gettype($bienKhongTonTai) . "<br>"; // Output: NULL
?>

Ví dụ minh họa biến trong PHP

Để kết thúc, chúng ta hãy xem xét một đoạn code PHP hoàn chỉnh, minh họa tất cả các khái niệm về khai báo, sử dụng, thao tác và kiểm tra biến mà chúng ta đã học. Ví dụ này mô phỏng một kịch bản đơn giản về quản lý thông tin khách hàng và sản phẩm trong một hệ thống cửa hàng.\

<?php

// --- Phần Giới Thiệu Biến ---
echo "<h2>1. Giới Thiệu Biến</h2>";
$appName = "Hệ Thống Quản Lý Đơn Hàng PHP"; // Tên ứng dụng
$appVersion = 1.0;                           // Phiên bản ứng dụng
echo "Chào mừng bạn đến với " . $appName . " (Phiên bản " . $appVersion . ")<br>";

// --- Phần Khai Báo Biến ---
echo "<h2>2. Khai Báo Biến</h2>";
$tenKhachHang = "Lê Thị Hoa";      // Khai báo chuỗi
$maDonHang = "DH2025-001X";      // Khai báo chuỗi với underscore
$tongTienDonHang = 750000;       // Khai báo số nguyên
$phanTramGiamGia = 0.10;         // Khai báo số thực
$coMaGiamGia = true;            // Khai báo boolean

echo "Khách hàng: " . $tenKhachHang . "<br>";
echo "Mã đơn hàng: " . $maDonHang . "<br>";
echo "Tổng tiền: " . $tongTienDonHang . " VNĐ<br>";
echo "Giảm giá: " . ($phanTramGiamGia * 100) . "%<br>";
echo "Có mã giảm giá: " . ($coMaGiamGia ? "Có" : "Không") . "<br>";

// --- Phần Các Kiểu Dữ Liệu Cơ Bản ---
echo "<h2>3. Các Kiểu Dữ Liệu Cơ Bản</h2>";

// Ví dụ về chuỗi (String) - nháy đơn vs nháy kép
$tenSanPham = "Điện thoại Samsung S25";
$thongBaoKhuyenMai = 'Sản phẩm "$tenSanPham" đang có ưu đãi lớn!'; // Không nội suy
$chiTietKhuyenMai = "Mua ngay {$tenSanPham} để nhận quà tặng!";     // Có nội suy
echo $thongBaoKhuyenMai . "<br>";
echo $chiTietKhuyenMai . "<br>";

// Ví dụ về mảng (Array) - mảng có chỉ mục và mảng kết hợp
$danhMucChinh = ["Điện tử", "Gia dụng", "Thời trang"];
echo "Danh mục 1: " . $danhMucChinh[0] . "<br>";

$chiTietSanPham = [
    "ma" => "SP001",
    "ten" => "Tai nghe Bluetooth",
    "gia" => 350000,
    "tonKho" => 50
];
echo "Sản phẩm: " . $chiTietSanPham["ten"] . ", Giá: " . $chiTietSanPham["gia"] . " VNĐ<br>";

// Ví dụ về NULL
$ghiChuChoDonHang = null;
if (is_null($ghiChuChoDonHang)) {
    echo "Đơn hàng này chưa có ghi chú.<br>";
}

// --- Phần Sử Dụng Biến (Thao tác & Phạm vi) ---
echo "<h2>4. Sử Dụng Biến</h2>";

// Thao tác với biến: Tính toán
$soLuongDat = 2;
$giaMotSanPham = 300000;
$subTotal = $soLuongDat * $giaMotSanPham;
$tienSauGiamGia = $subTotal - ($subTotal * $phanTramGiamGia);
echo "Tổng phụ (chưa giảm): " . $subTotal . " VNĐ<br>";
echo "Tổng tiền phải trả (sau giảm): " . $tienSauGiamGia . " VNĐ<br>";

// Thao tác với biến: So sánh và logic
$diemTichLuy = 1200;
$dieuKienGiamGiaCao = ($diemTichLuy >= 1000 && $coMaGiamGia);
if ($dieuKienGiamGiaCao) {
    echo "Khách hàng đủ điều kiện nhận thêm ưu đãi đặc biệt.<br>";
} else {
    echo "Khách hàng chưa đủ điều kiện ưu đãi đặc biệt.<br>";
}

// Phạm vi biến (Global vs Local vs Static)
echo "<h3>Phạm vi biến:</h3>";
$soLanTruyCapTrang = 0; // Biến toàn cục

function demTruyCapVaHienThi() {
    global $soLanTruyCapTrang; // Sử dụng biến toàn cục
    $soLanTruyCapTrang++;
    echo "Số lượt truy cập trang: " . $soLanTruyCapTrang . " (từ hàm)<br>";

    static $bienStatic = 0; // Biến static
    $bienStatic++;
    echo "Biến static trong hàm: " . $bienStatic . "<br>";
}

demTruyCapVaHienThi(); // Lần 1
demTruyCapVaHienThi(); // Lần 2
echo "Số lượt truy cập trang (từ ngoài hàm): " . $soLanTruyCapTrang . "<br>"; // Giá trị toàn cục được cập nhật

// --- Các hàm hữu ích với biến ---
echo "<h2>5. Các Hàm Hữu Ích Với Biến</h2>";
$duLieuForm = [
    "username" => "user123",
    "email" => "invalid-email" // Email không hợp lệ
];
$bienChuaTao; // Biến này chưa được định nghĩa

echo "<h3>var_dump() của \$duLieuForm:</h3>";
var_dump($duLieuForm);
echo "<br>";

echo "<h3>isset() và empty() ví dụ:</h3>";
if (isset($duLieuForm['username'])) {
    echo "Username đã được thiết lập.<br>";
}
if (!isset($bienChuaTao)) {
    echo "Biến \$bienChuaTao CHƯA được thiết lập.<br>";
}

if (empty($duLieuForm['password'])) { // Giả định trường password không có trong form này
    echo "Trường password đang trống (empty).<br>";
}

echo "Kiểu dữ liệu của \$phanTramGiamGia: " . gettype($phanTramGiamGia) . "<br>"; // Output: double

// --- Phần Thực Tiễn Tốt và Bảo Mật ---
echo "<h2>6. Các Lưu Ý và Thực Tiễn Tốt</h2>";

// Ví dụ về đặt tên biến rõ ràng
$soLuongTrongKho = $chiTietSanPham["tonKho"]; // Tên rõ ràng hơn
echo "Số lượng " . $chiTietSanPham['ten'] . " còn lại trong kho: " . $soLuongTrongKho . " chiếc.<br>";

// Ví dụ về khởi tạo biến
$tongGiaTriGioHang = 0; // Khởi tạo để đảm bảo luôn có giá trị số
$tongGiaTriGioHang += 50000;
echo "Tổng giá trị giỏ hàng: " . $tongGiaTriGioHang . " VNĐ<br>";

// Ví dụ về bảo mật dữ liệu đầu vào (từ người dùng)
$inputNguoiDung = $_GET['search'] ?? "<script>alert('XSS!');</script>Áo phông"; // Giả định từ URL
$safeInput = htmlspecialchars($inputNguoiDung, ENT_QUOTES, 'UTF-8');
echo "Kết quả tìm kiếm an toàn cho: " . $safeInput . "<br>"; // Mã độc bị vô hiệu hóa

$emailInput = "[email protected]";
$validatedEmail = filter_var($emailInput, FILTER_VALIDATE_EMAIL);
if ($validatedEmail === false) {
    echo "Email nhập vào không hợp lệ: " . htmlspecialchars($emailInput) . "<br>";
} else {
    echo "Email hợp lệ: " . $validatedEmail . "<br>";
}

?><?php

// --- Phần Giới Thiệu Biến ---
echo "<h2>1. Giới Thiệu Biến</h2>";
$appName = "Hệ Thống Quản Lý Đơn Hàng PHP"; // Tên ứng dụng
$appVersion = 1.0;                           // Phiên bản ứng dụng
echo "Chào mừng bạn đến với " . $appName . " (Phiên bản " . $appVersion . ")<br>";

// --- Phần Khai Báo Biến ---
echo "<h2>2. Khai Báo Biến</h2>";
$tenKhachHang = "Lê Thị Hoa";      // Khai báo chuỗi
$maDonHang = "DH2025-001X";      // Khai báo chuỗi với underscore
$tongTienDonHang = 750000;       // Khai báo số nguyên
$phanTramGiamGia = 0.10;         // Khai báo số thực
$coMaGiamGia = true;            // Khai báo boolean

echo "Khách hàng: " . $tenKhachHang . "<br>";
echo "Mã đơn hàng: " . $maDonHang . "<br>";
echo "Tổng tiền: " . $tongTienDonHang . " VNĐ<br>";
echo "Giảm giá: " . ($phanTramGiamGia * 100) . "%<br>";
echo "Có mã giảm giá: " . ($coMaGiamGia ? "Có" : "Không") . "<br>";

// --- Phần Các Kiểu Dữ Liệu Cơ Bản ---
echo "<h2>3. Các Kiểu Dữ Liệu Cơ Bản</h2>";

// Ví dụ về chuỗi (String) - nháy đơn vs nháy kép
$tenSanPham = "Điện thoại Samsung S25";
$thongBaoKhuyenMai = 'Sản phẩm "$tenSanPham" đang có ưu đãi lớn!'; // Không nội suy
$chiTietKhuyenMai = "Mua ngay {$tenSanPham} để nhận quà tặng!";     // Có nội suy
echo $thongBaoKhuyenMai . "<br>";
echo $chiTietKhuyenMai . "<br>";

// Ví dụ về mảng (Array) - mảng có chỉ mục và mảng kết hợp
$danhMucChinh = ["Điện tử", "Gia dụng", "Thời trang"];
echo "Danh mục 1: " . $danhMucChinh[0] . "<br>";

$chiTietSanPham = [
    "ma" => "SP001",
    "ten" => "Tai nghe Bluetooth",
    "gia" => 350000,
    "tonKho" => 50
];
echo "Sản phẩm: " . $chiTietSanPham["ten"] . ", Giá: " . $chiTietSanPham["gia"] . " VNĐ<br>";

// Ví dụ về NULL
$ghiChuChoDonHang = null;
if (is_null($ghiChuChoDonHang)) {
    echo "Đơn hàng này chưa có ghi chú.<br>";
}

// --- Phần Sử Dụng Biến (Thao tác & Phạm vi) ---
echo "<h2>4. Sử Dụng Biến</h2>";

// Thao tác với biến: Tính toán
$soLuongDat = 2;
$giaMotSanPham = 300000;
$subTotal = $soLuongDat * $giaMotSanPham;
$tienSauGiamGia = $subTotal - ($subTotal * $phanTramGiamGia);
echo "Tổng phụ (chưa giảm): " . $subTotal . " VNĐ<br>";
echo "Tổng tiền phải trả (sau giảm): " . $tienSauGiamGia . " VNĐ<br>";

// Thao tác với biến: So sánh và logic
$diemTichLuy = 1200;
$dieuKienGiamGiaCao = ($diemTichLuy >= 1000 && $coMaGiamGia);
if ($dieuKienGiamGiaCao) {
    echo "Khách hàng đủ điều kiện nhận thêm ưu đãi đặc biệt.<br>";
} else {
    echo "Khách hàng chưa đủ điều kiện ưu đãi đặc biệt.<br>";
}

// Phạm vi biến (Global vs Local vs Static)
echo "<h3>Phạm vi biến:</h3>";
$soLanTruyCapTrang = 0; // Biến toàn cục

function demTruyCapVaHienThi() {
    global $soLanTruyCapTrang; // Sử dụng biến toàn cục
    $soLanTruyCapTrang++;
    echo "Số lượt truy cập trang: " . $soLanTruyCapTrang . " (từ hàm)<br>";

    static $bienStatic = 0; // Biến static
    $bienStatic++;
    echo "Biến static trong hàm: " . $bienStatic . "<br>";
}

demTruyCapVaHienThi(); // Lần 1
demTruyCapVaHienThi(); // Lần 2
echo "Số lượt truy cập trang (từ ngoài hàm): " . $soLanTruyCapTrang . "<br>"; // Giá trị toàn cục được cập nhật

// --- Các hàm hữu ích với biến ---
echo "<h2>5. Các Hàm Hữu Ích Với Biến</h2>";
$duLieuForm = [
    "username" => "user123",
    "email" => "invalid-email" // Email không hợp lệ
];
$bienChuaTao; // Biến này chưa được định nghĩa

echo "<h3>var_dump() của \$duLieuForm:</h3>";
var_dump($duLieuForm);
echo "<br>";

echo "<h3>isset() và empty() ví dụ:</h3>";
if (isset($duLieuForm['username'])) {
    echo "Username đã được thiết lập.<br>";
}
if (!isset($bienChuaTao)) {
    echo "Biến \$bienChuaTao CHƯA được thiết lập.<br>";
}

if (empty($duLieuForm['password'])) { // Giả định trường password không có trong form này
    echo "Trường password đang trống (empty).<br>";
}

echo "Kiểu dữ liệu của \$phanTramGiamGia: " . gettype($phanTramGiamGia) . "<br>"; // Output: double

// --- Phần Thực Tiễn Tốt và Bảo Mật ---
echo "<h2>6. Các Lưu Ý và Thực Tiễn Tốt</h2>";

// Ví dụ về đặt tên biến rõ ràng
$soLuongTrongKho = $chiTietSanPham["tonKho"]; // Tên rõ ràng hơn
echo "Số lượng " . $chiTietSanPham['ten'] . " còn lại trong kho: " . $soLuongTrongKho . " chiếc.<br>";

// Ví dụ về khởi tạo biến
$tongGiaTriGioHang = 0; // Khởi tạo để đảm bảo luôn có giá trị số
$tongGiaTriGioHang += 50000;
echo "Tổng giá trị giỏ hàng: " . $tongGiaTriGioHang . " VNĐ<br>";

// Ví dụ về bảo mật dữ liệu đầu vào (từ người dùng)
$inputNguoiDung = $_GET['search'] ?? "<script>alert('XSS!');</script>Áo phông"; // Giả định từ URL
$safeInput = htmlspecialchars($inputNguoiDung, ENT_QUOTES, 'UTF-8');
echo "Kết quả tìm kiếm an toàn cho: " . $safeInput . "<br>"; // Mã độc bị vô hiệu hóa

$emailInput = "[email protected]";
$validatedEmail = filter_var($emailInput, FILTER_VALIDATE_EMAIL);
if ($validatedEmail === false) {
    echo "Email nhập vào không hợp lệ: " . htmlspecialchars($emailInput) . "<br>";
} else {
    echo "Email hợp lệ: " . $validatedEmail . "<br>";
}

?>

Kết bài

Vậy là chúng ta đã cùng nhau đi qua hành trình khám phá thế giới của biến trong PHP – từ những khái niệm cơ bản nhất, cách khai báo, các kiểu dữ liệu phong phú, cho đến những kỹ thuật thao tác và những lưu ý quan trọng về bảo mật. Hãy nghĩ về biến như những "ngăn tủ" đa năng mà bạn dùng để cất giữ mọi loại thông tin trong ứng dụng của mình. Việc hiểu rõ cách sử dụng chúng một cách hiệu quả và an toàn chính là nền tảng vững chắc để bạn xây dựng bất kỳ dự án PHP nào, từ đơn giản đến phức tạp.

Nắm vững cách quản lý biến không chỉ giúp code của bạn chạy đúng mà còn trở nên dễ đọc, dễ bảo trì và quan trọng hơn là an toàn trước các rủi ro bảo mật. Hãy luôn ghi nhớ các thực tiễn tốt như đặt tên rõ ràng, khởi tạo biến và đặc biệt là luôn kiểm tra và làm sạch dữ liệu từ người dùng.

Bài viết liên quan