Biến tĩnh cục bộ là biến được khai báo bên trong hàm với từ khóa static
trong PHP.
Điểm đặc biệt:
function myFunction() {
static $var = initial_value;
// ...
}
function counter() {
static $count = 0; // Chỉ khởi tạo một lần
$count++;
echo $count . PHP_EOL;
}
counter(); // 1
counter(); // 2
counter(); // 3
Giải thích:
$count
được khởi tạo bằng 0
.$count
được tăng lên và giữ nguyên cho các lần gọi tiếp theo.0
như biến cục bộ bình thường.function normalCounter() {
$count = 0; // Luôn khởi tạo lại mỗi lần gọi
$count++;
echo $count . PHP_EOL;
}
normalCounter(); // 1
normalCounter(); // 1
normalCounter(); // 1
Kết quả luôn là 1
vì $count
bị reset mỗi lần gọi hàm.
function getConfig() {
static $config = null;
if ($config === null) {
echo "Đang load config từ file...n";
$config = parse_ini_file('config.ini');
}
return $config;
}
getConfig(); // Load từ file
getConfig(); // Lấy từ cache trong hàm, không load lại
function logAccess() {
static $times = 0;
$times++;
echo "Hàm được gọi {$times} lầnn";
}
logAccess();
logAccess();
logAccess();
Ví dụ trong class xử lý dữ liệu, bạn không muốn lưu vào property của class nhưng vẫn cần giữ giá trị trong hàm.
✅ Tóm lại:
Biến tĩnh cục bộ trong PHP rất hữu ích để cache kết quả tạm thời trong 1 request hoặc giữ trạng thái nội bộ của hàm. Tuy nhiên, cần dùng hợp lý và nhớ rằng nó không lưu qua nhiều request.
Vài ví dụ về lưu dữ liệu cache bằng biến tĩnh cục bộ để tận dụng tối đa nó trong PHP, đặc biệt là trong bối cảnh như CodeIgniter hoặc WordPress.
function get_user_fields_without_pass() {
static $fields = null;
if ($fields === null) {
// Lần đầu query để lấy danh sách cột
$all_fields = $this->db->list_fields('wp_users');
$fields = array_diff($all_fields, ['user_pass']);
}
return $fields; // Các lần sau trả từ cache
}
// Sử dụng
$this->db->select(implode(',', get_user_fields_without_pass()));
$this->db->from('wp_users');
💡 Lợi ích: list_fields()
chỉ chạy 1 lần trong suốt request.
function get_user_by_email($email) {
static $cache = []; // cache theo email
if (isset($cache[$email])) {
return $cache[$email]; // trả từ cache
}
$user = $this->db->get_where('wp_users', ['user_email' => $email])->row_array();
unset($user['user_pass']); // bỏ pass
$cache[$email] = $user; // lưu vào cache
return $user;
}
💡 Lợi ích: Nếu cùng một request cần lấy thông tin user đó nhiều lần, sẽ không query DB lại.
function get_config() {
static $config = null;
if ($config === null) {
echo "Đang load config...n";
$config = parse_ini_file('app.ini');
}
return $config;
}
// Gọi nhiều lần
get_config(); // load từ file
get_config(); // lấy từ cache
💡 Lợi ích: File chỉ được đọc 1 lần duy nhất.
function fibonacci($n) {
static $cache = [];
if (isset($cache[$n])) {
return $cache[$n]; // trả từ cache
}
if ($n < 2) {
return $n;
}
$cache[$n] = fibonacci($n - 1) + fibonacci($n - 2);
return $cache[$n];
}
echo fibonacci(40); // Lần đầu chậm
echo fibonacci(40); // Lần sau gần như ngay lập tức
💡 Lợi ích: Giảm thời gian tính toán đệ quy cực lớn.
function get_categories() {
static $categories = null;
if ($categories === null) {
$categories = $this->db->get('wp_terms')->result_array();
}
return $categories;
}
💡 Lợi ích: Nếu nhiều hàm cần danh sách category trong cùng request, chỉ query DB 1 lần.
📌 Nhớ: Cache bằng static
chỉ tồn tại trong cùng 1 request.
Nếu muốn giữ qua nhiều request, bạn phải dùng APCu, Redis, Memcached hoặc file cache.