Trong PHP, biến toàn cục (global variables) là một khái niệm cơ bản nhưng vô cùng quan trọng, đặc biệt khi bạn muốn chia sẻ dữ liệu giữa các hàm hoặc file khác nhau. Hiểu, sử dụng và quản lý chúng đúng cách sẽ giúp bạn viết code hiệu quả, tránh lỗi không mong muốn và tối ưu hóa cấu trúc chương trình. Bài viết này sẽ hướng dẫn bạn cách khai báo biến toàn cục trong PHP cũng như những lưu ý quan trọng khi sử dụng để đảm bảo code của bạn vừa an toàn vừa dễ bảo trì.
- Biến toàn cục trong PHP là gì?
- Vai trò của biến toàn cục PHP trong phát triển web
- Sự khác biệt giữa biến toàn cục và biến cục bộ trong PHP
- Cách khai báo và sử dụng biến toàn cục trong PHP
- Mảng siêu toàn cục (Superglobals) trong PHP
- Hai mặt của biến toàn cục PHP dưới góc nhìn lập trình viên
- Bí quyết sử dụng biến toàn cục PHP để hạn chế rủi ro và đạt hiệu quả tốt
- Một số câu hỏi thường gặp về biến toàn cục trong PHP
Biến toàn cục trong PHP là gì?
Trong PHP, biến toàn cục (global variable) là biến được khai báo bên ngoài tất cả các hàm, lớp hoặc khối lệnh và nó có phạm vi (scope) toàn cục, nghĩa là có thể được truy cập từ bất kỳ đâu trong tệp PHP nếu sử dụng đúng cách.
Tuy nhiên theo mặc định, các biến toàn cục trong PHP không thể trực tiếp truy cập bên trong hàm, bạn cần dùng từ khóa global hoặc mảng siêu toàn cục $GLOBALS để sử dụng chúng trong hàm.
Ví dụ:
< ?php
// Biến toàn cục
$soLuong = 10;
function hienThiSoLuong() {
// Cách 1: Dùng từ khóa global
global $soLuong;
echo "Số lượng: $soLuong
";
// Cách 2: Dùng mảng $GLOBALS
echo "Số lượng: " . $GLOBALS['soLuong'] . "
";
}
hienThiSoLuong();
? >
Giải thích:
- $soLuong được khai báo bên ngoài hàm, là biến toàn cục.
- Bên trong hàm hienThiSoLuong(), nếu muốn truy cập $soLuong, phải dùng global $soLuong hoặc $GLOBALS['soLuong'].
- Nếu không dùng global hay $GLOBALS, PHP sẽ coi biến trong hàm là biến cục bộ và bạn sẽ không thể truy cập giá trị của biến toàn cục.
Vai trò của biến toàn cục PHP trong phát triển web
Trong quá trình lập trình web bằng PHP, biến toàn cục đóng vai trò quan trọng trong việc chia sẻ dữ liệu giữa các hàm và phần khác nhau của chương trình. Hiểu rõ cách sử dụng biến toàn cục giúp quản lý dữ liệu hiệu quả hơn, tránh lỗi logic và đảm bảo tính nhất quán trong ứng dụng.
- Chia sẻ dữ liệu giữa nhiều hàm: Biến toàn cục cho phép nhiều hàm trong cùng một tệp PHP có thể truy cập chung một giá trị mà không cần phải truyền tham số liên tục. Điều này làm cho mã nguồn gọn gàng và dễ đọc hơn.
- Lưu trữ thông tin cấu hình chung: Những thông tin quan trọng như cấu hình kết nối cơ sở dữ liệu, đường dẫn thư mục hoặc các hằng số ứng dụng thường được khai báo dưới dạng biến toàn cục để có thể sử dụng ở nhiều nơi khác nhau trong dự án.
- Quản lý trạng thái ứng dụng: Trong một số trường hợp, biến toàn cục có thể dùng để lưu trữ trạng thái tạm thời của ứng dụng, chẳng hạn số lượng người dùng đang đăng nhập hoặc phiên bản hiện tại của hệ thống.
- Giảm sự trùng lặp trong mã: Thay vì khai báo lại cùng một biến ở nhiều hàm khác nhau, bạn có thể khai báo biến toàn cục trong PHP một lần và sử dụng lại. Điều này giúp tiết kiệm thời gian, giảm sai sót và tối ưu mã.
Sự khác biệt giữa biến toàn cục và biến cục bộ trong PHP
Trong PHP, biến có phạm vi hoạt động (scope) khác nhau tùy theo nơi chúng được khai báo. Hai loại thường gặp nhất là biến toàn cục và biến cục bộ trong PHP. Hiểu rõ sự khác biệt giúp lập trình viên kiểm soát dữ liệu tốt hơn, tránh xung đột hoặc lỗi logic trong ứng dụng web.
Tiêu chí | Biến toàn cục (Global Variable) | Biến cục bộ (Local Variable) |
Phạm vi hoạt động | Sử dụng được ở ngoài các hàm và có thể dùng trong hàm nếu gọi global hoặc $GLOBALS. | Chỉ tồn tại và có hiệu lực trong hàm nơi nó được khai báo. |
Vị trí khai báo | Khai báo bên ngoài tất cả các hàm, lớp hoặc khối lệnh. | Khai báo bên trong một hàm. |
Khả năng truy cập | Có thể truy cập từ nhiều hàm khác nhau (khi khai báo global). | Chỉ có thể truy cập trong phạm vi hàm chứa nó. |
Thời gian tồn tại | Tồn tại suốt vòng đời của script. | Chỉ tồn tại khi hàm được thực thi, sau đó sẽ bị hủy. |
Ứng dụng thường gặp | Lưu cấu hình, thông tin dùng chung, trạng thái ứng dụng. | Xử lý dữ liệu tạm thời, logic riêng trong hàm. |
Cách khai báo và sử dụng biến toàn cục trong PHP
Các biến toàn cục trong PHP thường được dùng để chia sẻ dữ liệu giữa nhiều hàm. Tuy nhiên, vì PHP không cho phép truy cập trực tiếp các biến này bên trong hàm nên bạn cần biết các cách khai báo biến toàn cục trong PHP để tránh lỗi trong quá trình lập trình.
Cách 1. Khai báo biến toàn cục trong PHP
Bạn chỉ cần tạo biến bên ngoài phạm vi của các hàm hoặc khối mã khác. Khi khai báo biến ở phần ngoài cùng của file PHP, không nằm trong bất kỳ hàm nào, biến đó sẽ có phạm vi toàn cục. Biến này có thể được truy cập từ bất kỳ đoạn mã nào nằm bên ngoài các hàm trong cùng file.
Ví dụ:
< ?php
$ten = "Nguyen Van A"; // biến toàn cục
? >
Cách 2. Sử dụng từ khóa global
Khi muốn sử dụng biến toàn cục trong hàm, bạn cần khai báo nó với từ khóa global để hàm nhận biết được biến này là biến toàn cục chứ không phải biến cục bộ (local variable) mới tạo ra bên trong hàm. Từ khóa global giúp tham chiếu đến biến toàn cục đã khai báo ngoài hàm, từ đó hàm có thể đọc và sửa giá trị biến toàn cục đó.
Ví dụ:
< ?php
$ten = "Nguyen Van A"; // biến toàn cục
function hienthiten() {
global $ten; // Khai báo biến toàn cục
echo $ten ;
}
hienthiten(); // in ra "Nguyen Van A"
? >
Giải thích: Nếu không khai báo global trước biến $ten trong hàm, PHP sẽ hiểu biến $ten bên trong hàm là biến cục bộ mới, không liên quan đến biến toàn cục, do đó sẽ báo lỗi biến chưa khai báo hoặc không hiển thị giá trị đúng.
Cách 3: Sử dụng mảng $GLOBALS
Cách khai báo biến toàn cục trong PHP này cung cấp mảng siêu toàn cục $GLOBALS để truy cập tất cả biến toàn cục từ bất kỳ đâu, kể cả trong hàm mà không cần dùng từ khóa global. Mảng $GLOBALS là một mảng liên kết đặc biệt chứa tất cả các biến toàn cục với khóa là tên biến và giá trị là giá trị biến đó.
Ví dụ:
< ?php
$a = 5;
$b = 10;
function tinhTong() {
$tong = $GLOBALS['a'] + $GLOBALS['b'];
echo $tong;
}
tinhTong(); // in ra 15
?>
Giải thích:
- $GLOBALS là một mảng liên kết chứa tất cả biến toàn cục.
- Bạn có thể đọc hoặc thay đổi giá trị biến toàn cục bằng $GLOBALS['tên_biến'].
Mảng siêu toàn cục (Superglobals) trong PHP
Ngoài biến toàn cục thông thường, PHP còn có mảng siêu toàn cục (superglobals), những biến luôn có sẵn và có thể truy cập từ bất kỳ đâu trong chương trình mà không cần khai báo global. Chúng giúp bạn làm việc dễ dàng với dữ liệu từ form, session, cookie hay server. Dưới đây là một số superglobals phổ biến:
1. $_GET
$_GET chứa dữ liệu được gửi qua chuỗi truy vấn của URL (query string), thường dùng khi form gửi bằng phương thức GET hoặc khi truyền tham số trực tiếp trong URL. Dữ liệu từ $_GET luôn cần lọc và xác thực trước khi dùng (ví dụ intval, filter_input) vì người dùng có thể sửa URL.
Ví dụ:
< ?php
// URL: example.com?name=Alice&age=25
$ name = $_GET['name'];
$ age = $_GET['age'];
echo "Xin chào $name, bạn $age tuổi.";
? >
Cụ thể:
- Truyền dữ liệu qua URL → đọc bằng $_GET['tên_tham_số'].
- Cần lọc dữ liệu (ví dụ intval($_GET['age'])) để tránh lỗi hoặc tấn công bảo mật.
2. $_POST
$_POST nhận dữ liệu được gửi bằng phương thức HTTP POST, phù hợp cho các form chứa dữ liệu lớn hơn hoặc nhạy cảm (ví dụ mật khẩu, nội dung). Tương tự $_GET, $_POST cần xác thực và thoát (escape) trước khi hiển thị hoặc lưu, thường kết hợp $_SERVER['REQUEST_METHOD'] để kiểm tra kiểu yêu cầu.
Ví dụ:
< ?php
if ($ _SERVER['REQUEST_METHOD'] == 'POST' ) {
$ username = $_POST['username' ];
$ password = $_POST['password' ];
echo "Tên đăng nhập: $username";
}
? >
3. $_REQUEST
$_REQUEST là một mảng hợp nhất chứa dữ liệu từ $_GET, $_POST và $_COOKIE (tùy cấu hình variables_order/request_order). Vì tính “gộp” này, $_REQUEST tiện nhưng không an toàn khi dùng trong trường hợp nhạy cảm do có thể gây mơ hồ nguồn dữ liệu nên ưu tiên sử dụng $_GET hoặc $_POST rõ ràng.
Ví dụ:
< ?php
$value = $_REQUEST['data'];
echo "Bạn gửi: $value";
? >
4. $_SESSION
$_SESSION dùng để lưu trạng thái giữa các request cho một phiên người dùng; trước khi dùng cần gọi session_start(). Dữ liệu session được lưu server-side (thường là file hoặc storage khác) và chỉ tham chiếu bằng cookie session id trên client, vì vậy an toàn hơn cookie thuần túy nhưng vẫn cần các biện pháp như session_regenerate_id(), HTTPS và cấu hình cookie an toàn để tránh tấn công hijacking/fixation.
Ví dụ:
< ?php
session_start();
$_SESSION ['username'] = 'Alice';
echo "Xin chào " . $_SESSION['username'];
? >
5. $_SERVER
$_SERVER chứa thông tin về máy chủ, môi trường và request hiện tại (ví dụ REQUEST_METHOD, REQUEST_URI, HTTP_HOST, REMOTE_ADDR). Thông tin này rất hữu ích để xử lý route, kiểm tra nguồn yêu cầu hoặc lấy user agent nhưng một số trường có thể bị giả mạo (ví dụ HTTP headers từ client) nên không dùng làm cơ sở an ninh tuyệt đối.
Ví dụ:
< ?php
echo "Bạn đang truy cập trang : " . $_SERVER['REQUEST_URI'];
echo "IP của bạn là : " . $_SERVER['REMOTE_ADDR'];
? >
6. $_FILES
$_FILES lưu thông tin các file được upload qua form (< input type="file" >). Mỗi file có các chỉ mục như name, type, tmp_name, error, size. Khi xử lý upload, bạn cần kiểm tra lỗi (error), kiểm tra loại/tần suất kích thước và dùng move_uploaded_file() để di chuyển file từ thư mục tạm.
Ví dụ:
< ?php
if(isset($ _FILES['avatar'])) {
$ fileName = $_FILES['avatar']['name'];
$ tmpName = $_FILES['avatar']['tmp_name'];
move_uploaded_file($tmpName, "uploads/$fileName");
echo "Upload thành công: $fileName";
}
? >
$_COOKIE chứa cookie gửi từ trình duyệt, để đặt cookie trong PHP dùng setcookie() (phải gọi trước khi xuất dữ liệu HTML). Cookie nằm trên client nên không tin tưởng tuyệt đối, dữ liệu có thể bị sửa hoặc xóa bởi người dùng, vì thế không lưu thông tin nhạy cảm trực tiếp trong cookie (nên dùng token/phiên).
Ví dụ:
< ?php
setcookie("user", "Alice", time() + 3600); // cookie 1 giờ
echo $_COOKIE['user'] ?? 'Chưa có cookie';
? >
8. $_ENV
$_ENV chứa biến môi trường (environment variables) được cấp cho PHP từ hệ điều hành hoặc cấu hình web server; có thể đọc bằng $_ENV['KEY'] hoặc getenv('KEY'). Tùy cấu hình PHP (variables_order) mà $_ENV có thể không chứa mọi biến, đôi khi dùng thư viện quản lý cấu hình (.env) hoặc hàm getenv() là lựa chọn ổn định hơn.
Ví dụ:
< ?php
$dbUser = $_ENV[ 'DB_USER' ] ?? 'root';
$dbPass = $_ENV[ 'DB_PASS' ] ?? '';
echo "Kết nối DB với user: $dbUser";
? >
Hai mặt của biến toàn cục PHP dưới góc nhìn lập trình viên
Trong quá trình phát triển web bằng PHP, biến toàn cục là công cụ hữu ích nhưng cũng tiềm ẩn nhiều rủi ro nếu lạm dụng. Lập trình viên thường xem chúng như “con dao hai lưỡi” vừa mang lại sự tiện lợi trong việc chia sẻ dữ liệu, vừa có thể làm mã trở nên khó bảo trì và dễ gây lỗi logic.
1. Ưu điểm của biến toàn cục trong PHP
Biến toàn cục mang lại một số lợi thế rõ rệt, đặc biệt trong các dự án nhỏ hoặc các tình huống cần sự nhanh gọn.
- Chia sẻ dữ liệu giữa nhiều hàm: Biến toàn cục giúp nhiều hàm trong cùng một chương trình có thể truy cập và sử dụng cùng một giá trị mà không cần phải truyền tham số liên tục. Điều này làm cho mã nguồn trở nên gọn nhẹ và dễ đọc hơn trong một số trường hợp.
- Lưu trữ thông tin cấu hình chung: Thay vì phải khai báo lại nhiều lần, các giá trị cấu hình như thông tin kết nối cơ sở dữ liệu, đường dẫn thư mục lưu trữ hay hằng số toàn cục có thể được khai báo một lần dưới dạng biến toàn cục và sử dụng ở mọi nơi trong ứng dụng.
- Giảm sự trùng lặp trong khai báo: Khi một giá trị cần được dùng lặp lại ở nhiều nơi, thay vì khai báo lại nhiều lần, bạn chỉ cần định nghĩa một biến toàn cục duy nhất. Điều này giúp tránh việc “copy-paste” và giảm nguy cơ sai lệch khi cần thay đổi giá trị.
- Tiết kiệm thời gian phát triển trong dự án nhỏ: Với những ứng dụng nhỏ hoặc script nhanh, sử dụng biến toàn cục giúp lập trình viên không phải xây dựng cấu trúc phức tạp. Bạn có thể gọi và sử dụng giá trị ở bất cứ đâu mà không cần thiết kế lớp hoặc truyền tham số rườm rà.
- Tiện lợi khi debug hoặc thử nghiệm: Trong giai đoạn thử nghiệm, biến toàn cục có thể giúp lưu trữ tạm thời các giá trị để kiểm tra nhanh mà không cần viết thêm nhiều logic.
2. Hạn chế của biến toàn cục PHP
Tuy nhiên, lạm dụng biến toàn cục cũng mang đến nhiều nhược điểm, đặc biệt trong các ứng dụng lớn hoặc theo hướng lập trình hiện đại.
- Mã nguồn khó bảo trì: Khi ứng dụng phát triển, việc kiểm soát sự thay đổi của biến toàn cục trở nên phức tạp. Chỉ cần một chỉnh sửa nhỏ cũng có thể ảnh hưởng đến nhiều phần khác nhau trong chương trình, dẫn đến lỗi khó phát hiện.
- Giảm tính đóng gói: Biến toàn cục đi ngược lại nguyên tắc đóng gói của lập trình hướng đối tượng, vì bất kỳ phần nào của chương trình cũng có thể thay đổi giá trị của nó. Điều này làm giảm tính an toàn của dữ liệu và dễ dẫn đến xung đột hoặc hành vi không mong muốn.
- Tăng nguy cơ xung đột tên biến: Trong các dự án lớn với nhiều lập trình viên, việc sử dụng biến toàn cục có thể dẫn đến tình trạng trùng tên hoặc ghi đè dữ liệu, gây ra lỗi logic khó kiểm soát.
- Khó kiểm soát luồng dữ liệu: Khi quá nhiều hàm phụ thuộc vào biến toàn cục, chương trình sẽ mất tính rõ ràng về dữ liệu được truyền đi đâu và sử dụng thế nào, dẫn đến thiết kế phần mềm kém chặt chẽ.
Bí quyết sử dụng biến toàn cục PHP để hạn chế rủi ro và đạt hiệu quả tốt
Biến toàn cục trong PHP là công cụ hữu ích giúp chia sẻ dữ liệu giữa nhiều hàm và phần khác nhau của ứng dụng. Tuy nhiên nếu lạm dụng hoặc quản lý không hợp lý, chúng có thể gây ra rủi ro lớn về hiệu năng, bảo mật và tính bảo trì.
1. Hạn chế lạm dụng biến toàn cục
Biến toàn cục chỉ nên được sử dụng trong những tình huống thật sự cần thiết, chẳng hạn lưu trữ thông tin cấu hình hệ thống hoặc dữ liệu dùng chung xuyên suốt chương trình. Nếu lạm dụng chúng để thay thế cho biến cục bộ hoặc để lưu trữ tạm thời, mã nguồn sẽ trở nên khó bảo trì, dễ gây lỗi logic và xung đột không mong muốn. Một nguyên tắc đơn giản là: nếu một biến chỉ cần trong phạm vi hẹp, hãy để nó ở đúng phạm vi đó.
2. Sử dụng biến cục bộ kết hợp truyền tham số qua hàm
Một giải pháp an toàn hơn biến toàn cục là ưu tiên dùng biến cục bộ trong hàm và truyền tham số khi cần. Cách làm này giúp dữ liệu được kiểm soát chặt chẽ trong phạm vi rõ ràng, dễ dàng theo dõi luồng xử lý và tránh tình trạng hàm này vô tình làm thay đổi dữ liệu của hàm khác. Thói quen này không chỉ giúp mã nguồn “sạch” hơn mà còn nâng cao khả năng tái sử dụng hàm trong nhiều ngữ cảnh khác nhau.
3. Dùng lớp (class) hoặc cấu trúc dữ liệu thay thế khi cần
Trong những dự án có quy mô lớn hoặc khi làm việc theo hướng lập trình hướng đối tượng (OOP), việc gói dữ liệu vào trong lớp (class) hoặc cấu trúc dữ liệu sẽ tối ưu hơn nhiều so với biến toàn cục. Thay vì khai báo biến toàn cục rải rác, bạn có thể tập trung dữ liệu trong một lớp chuyên quản lý cấu hình hoặc một đối tượng cụ thể. Cách này không chỉ giúp mã nguồn dễ tổ chức, mà còn tăng tính đóng gói, bảo mật và dễ bảo trì về lâu dài.
4. Đặt tên biến rõ ràng để tránh xung đột
Nếu bắt buộc phải sử dụng biến toàn cục, hãy đặt tên biến thật rõ ràng, mô tả đúng chức năng và theo một quy ước nhất định. Ví dụ, sử dụng tiền tố như $config_dbHost, $global_userSession để phân biệt với các biến cục bộ. Cách đặt tên có hệ thống giúp lập trình viên khác dễ hiểu ý nghĩa của biến, đồng thời giảm nguy cơ trùng tên khi làm việc trong một dự án nhiều người. Đây là một thói quen nhỏ nhưng mang lại hiệu quả lớn trong quản lý mã nguồn.
Một số câu hỏi thường gặp về biến toàn cục trong PHP
Trong quá trình học và làm việc với PHP, nhiều lập trình viên thường đặt ra những thắc mắc liên quan đến cách sử dụng biến toàn cục. Đây là những câu hỏi phổ biến nhất cùng phần giải đáp chi tiết, giúp bạn hiểu rõ hơn và áp dụng hiệu quả trong thực tế.
1. Biến toàn cục PHP được lưu trữ ở đâu?
Trong PHP, biến toàn cục được lưu trữ trong bộ nhớ của script hiện tại và tồn tại trong suốt vòng đời thực thi của chương trình. Chúng có thể được truy cập thông qua mảng siêu toàn cục $GLOBALS, vốn là một mảng kết hợp đặc biệt chứa tất cả các biến toàn cục. Tuy nhiên, sau khi script kết thúc, biến toàn cục PHP cũng sẽ bị giải phóng, không còn tồn tại trong lần thực thi tiếp theo.
2. Liệu việc sử dụng $GLOBALS có tốt hơn từ khóa global không?
Cả $GLOBALS và từ khóa global đều có tác dụng truy cập biến toàn cục bên trong hàm. Tuy nhiên, $GLOBALS thường linh hoạt hơn vì nó cho phép bạn truy cập biến một cách trực tiếp qua mảng mà không cần khai báo lại với từ khóa global. Dù vậy, lạm dụng $GLOBALS có thể khiến mã nguồn khó đọc hơn. Trong thực tế, nên lựa chọn cách nào phù hợp với dự án và ưu tiên sự rõ ràng, nhất quán trong toàn bộ codebase.
3. Làm thế nào để xóa biến toàn cục trong PHP?
Để xóa một biến toàn cục, bạn có thể dùng hàm unset(). Ví dụ:
unset($GLOBALS['bienToanCuc']);
hoặc đơn giản là:
unset($bienToanCuc);
Khi đó, biến sẽ không còn tồn tại trong phạm vi script nữa. Việc xóa biến toàn cục giúp giải phóng bộ nhớ và tránh việc vô tình sử dụng lại giá trị cũ ở những đoạn code khác.
4. Trường hợp nào nên tránh sử dụng biến toàn cục trong PHP?
Biến toàn cục nên tránh sử dụng trong các dự án web PHP lớn, có nhiều lập trình viên cùng làm việc bởi chúng làm tăng nguy cơ xung đột và khó bảo trì. Ngoài ra, khi xây dựng các ứng dụng hướng đối tượng hoặc ứng dụng có cấu trúc phức tạp, việc dựa vào biến toàn cục sẽ làm giảm tính đóng gói và gây khó khăn cho việc kiểm soát luồng dữ liệu. Trong những tình huống này, giải pháp thay thế sẽ an toàn và hiệu quả hơn.
5. Có những giải pháp thay thế hiệu quả nào cho biến toàn cục PHP?
Một số giải pháp thay thế biến toàn cục PHP có thể kể đến là sử dụng biến cục bộ kết hợp truyền tham số, tạo lớp (class) để quản lý dữ liệu hoặc lưu trữ thông tin trong session, cookie hoặc cơ sở dữ liệu nếu cần dùng nhiều lần và xuyên suốt ứng dụng. Những cách này giúp dữ liệu được kiểm soát rõ ràng hơn, tránh rủi ro và đảm bảo mã nguồn dễ mở rộng, bảo trì về lâu dài.
Qua bài viết của Phương Nam Vina, có thể thấy biến toàn cục PHP vừa mang lại sự tiện lợi vừa tiềm ẩn không ít rủi ro nếu sử dụng không hợp lý. Chúng giúp chia sẻ dữ liệu giữa nhiều hàm, lưu trữ thông tin cấu hình chung và giảm sự trùng lặp trong mã nhưng đồng thời cũng khiến chương trình dễ khó bảo trì, mất tính đóng gói và kém an toàn. Vì vậy, lập trình viên nên cân nhắc kỹ trước khi áp dụng, chỉ dùng biến toàn cục trong những tình huống thật sự cần thiết kết hợp với các giải pháp thay thế như truyền tham số, sử dụng lớp hoặc lưu trữ trong session.