Các mẫu thiết kế trong PHP 8: Singleton & Multiton
Tôi muốn nói về các mẫu thiết kế trong php trong một vài bài viết tiếp theo. Và tôi thực sự thích sự tiến bộ của ngôn ngữ, đó là lý do tại sao tôi sẽ đưa ra các ví dụ với các ghi chú cuối cùng của php 8.
Singleton
Đôi khi chúng ta chỉ cần một thể hiện của một số lớp ở các vị trí mã khác nhau. Ví dụ, khi chúng ta tạo ứng dụng web, thông thường nó cần kết nối với cơ sở dữ liệu và sẽ thực sự tốt khi chỉ tạo một bản sao của kết nối và sử dụng nó trong mọi tệp, lớp, hàm. Mẫu sẽ giúp chúng ta điều này – Singleton là một trong những mẫu phổ biến nhất và dễ thiết kế nhất.
Hãy xem cách chúng ta có thể triển khai kết nối cơ sở dữ liệu lớp và ghi nhật ký với một cá thể trong tất cả các đối tượng:
class Singleton
{
protected static self|null $instance = null;
final private function __construct(){}
final protected function __clone(){}
final protected function __wakeup(){}
public static function getInstance(): self
{
if (self::$instance === null) {
self::$instance = new self;
}
return self::$instance;
}
}
class Database extends Singleton
{
public function connect()
{
// ...
}
}
class Logger extends Singleton
{
public static function error(string $message)
{
// ...
}
public static function warn(string $message)
{
// ...
}
}
Làm thế nào để sử dụng nó:
$db = Database::getInstance();
$db->connect();
$logger = Logger::getInstance();
$logger::error('Something wrong');
Multiton
Nhưng điều gì sẽ xảy ra nếu chúng ta cần nhiều hơn sau đó chỉ là một phiên bản của trình ghi nhật ký vì một số thư phải được viết trong tệp, một số cần gửi qua email? Hoặc chúng ta có thể có những lý do khác. Đối với điều đó, chúng tôi sẽ sử dụng mẫu Multiton. Multiton trông thực sự giống với mẫu trước đó nhưng với mảng thể hiện của lớp.
class Multiton
{
protected static array|null $instance = null;
final private function __construct(){}
final protected function __clone(){}
final protected function __wakeup(){}
public static function getInstance(int|string $key): self
{
if (!array_key_exists($key, self::$instance)) {
self::$instance[$key] = new self;
}
return self::$instance[$key];
}
}
class Logger extends Multiton
{
private array $settings;
public function setSettings(array $settings)
{
// ...
}
public function error(string $message)
{
// ...
}
public function warn(string $message)
{
// ...
}
}
Hãy tạo hai trình ghi nhật ký với các cài đặt khác nhau để lưu nhật ký vào tệp và cơ sở dữ liệu. Tôi sẽ không mô tả chi tiết bộ cài đặt và trình ghi vào tệp / cơ sở dữ liệu vì nó không quan trọng đối với mẫu.
$fileLogger = Logger::getInstance('file');
$fileLogger->setSettings([
//...
]);
$fileLogger->error('Error text');
$dbLogger = Logger::getInstance('database');
$dbLogger->setSettings([
//...
]);
$dbLogger->error('Error will write in Database');