1. Định nghĩa
Đối với trường phái OOP class – based, mọi thứ đều thuộc về object, class chỉ là bản thiết kế, phải có class mới có object, dẫn đến muốn gọi 1 Property hay Method thì phải khởi tạo object.
Tuy nhiên đôi lúc có những giá trị như Hằng Số (Constant) hoặc một Utility class (tiện ích) thì không cần quản lý state.
Chẳng hạn nếu viết logic lấy mã vùng số phone theo dạng OOP class-based:
<?php
class PhoneUtil
{
public function getCountryCode(string $country): string
{
return match($country) {
'vn' => '+84',
default => null
};
}
}
$p = new PhoneUtil();
echo $p->getCountryCode('vn');
Rõ ràng là rất lằng nhằng vì việc phải new nhiều instance PhoneUtil là vô nghĩa.
Còn trong trường phái OOP prototype-based, việc call một hàm mà không cần tạo ra instance rất đơn giản:
function MathUtil() {} // constructor function
MathUtil.square = function(n) {
return n * n;
};
console.log(MathUtil.square(5)); // 25
Do vậy trường phái OOP class-based đã tạo ra một khái niệm, cho phép định nghĩa data/function thuộc về Class, KHÔNG thuộc về Object. Đó gọi là Static.
Sửa lại class PhoneUtil
<?php
class PhoneUtil
{
public static function getCountryCode(string $country): string
{
return match($country) {
'vn' => '+84',
default => null
};
}
}
echo PhoneUtil::getCountryCode('vn'); // ra +84, không cần new instance
Một ví dụ khác với static data
<?php
class PhoneUtil
{
public static $map = [
'vn' => '+84',
];
public static function getCountryCode(string $country): string
{
return $map[$country] ?? null;
}
}
echo PhoneUtil::getCountryCode($country); // in ra +84
2. Late Static Binding
Late Static Binding là một cơ chế của PHP cho phép xác định class đã gọi phương thức tĩnh (static method) tại thời điểm runtime, chứ không dựa vào class nơi method được định nghĩa.
class Model
{
public static function create()
{
return new static(); // sử dụng từ khoá static làm late binding
}
}
class User extends Model {}
class Product extends Model {}
var_dump(User::create()); // instance User
var_dump(Product::create()); // instance Product
Đây là cơ chế thể hiện Tính Đa Hình của OOP cho static.
3. Chú ý khi sử dụng
Phải hiểu rõ static là anti-design vì lý do ra đời là để khắc phục điểm yếu của trường phái OOP – class based, nên tuyệt đối không lạm dụng static, đặc biệt là lạm dụng static data (hay còn gọi là static property của class).
Nếu đóng gói data và function vào bên trong Object, thì khi Object bị huỷ, tất cả data sẽ bị huỷ theo, giải phóng bộ nhớ, rất an toàn cho việc kiểm soát memory leak trên Production, tránh tràn RAM.
Tuy nhiên static data thì phải huỷ thủ công, vì data này thuộc về Class, không thuộc về Object, huỷ Object không giải phóng static data.
Static thông thường chỉ để chứa các function Utility (tiện ích), như xử lý string, xử lý array …