Ứng dụng Singleton Design Pattern trong lập trình PHP

Là pattern được sử dụng để tạo sự ràng buộc, chỉ cho phép với class nào đó chỉ có duy nhất 1 đối tượng được khởi tạo mà thôi. Và để làm được điều đó, ta phải sử dụng 1 số kỹ thuật nhằm khóa và không cho phép đối tượng được phép khởi tạo trực tiếp.

Khai báo và khởi tạo đối tượng không phải là Singleton

<?php
class NoneSingleton
{
    public static $count = 0;
 
    public function __construct(){
        self::$count++;
        echo "Khởi tạo đối tượng NoneSingleton lần thứ: " . self::$count . "<br>";
    }
}
 
$noneSingle = new NoneSingleton();
$noneSingleOther = new NoneSingleton();
?>

Vì có hai dòng thông báo được tạo ra nên chứng tỏ có hai đối tượng  tương ứng cũng được tạo ra.

Khai báo và khởi tạo đối tượng Singleton

<?php
class Singleton
{
    private static $instance = null;
    public static $count = 0;
 
    public function __construct()
    {
        self::$count++;
        echo "Khởi tạo đối tượng là Singleton lần thứ: " . self::$count . "<br>";
    }
 
    private function __clone()
    {
    }
 
    private function __sleep()
    {
    }
 
    private function __wakeup()
    {
    }
 
    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new Singleton();
        }
 
        return self::$instance;
    }
}
 
$instance = Singleton::getInstance();
$instance22 = Singleton::getInstance();
?>

Chỉ có một dòng thông báo được tạo ra, điều này chứng tỏ chỉ có duy nhất một đối tượng được tạo ra.

Chúng ta đều biết, không nêu mở nhiều kết nối đến cơ sở dữ liệu(CSDL). Vì việc mở nhiều kết nối sẽ gây hại cho ứng dụng. Vậy làm sao để hạn chế việc này? Một trong các cách đó là ứng dụng Singleton Design Pattern để thiết kế việc kết nối đến CSDL.

Áp dụng Singleton Design Pattern trong việc kết nối cơ sở dữ liệu Mysql

<?php
class ConnectDb
{
    private static $instance = null;
    private $conn;
 
    private $host = "localhost";
    private $db_name = "demo_singleton";
    private $username = "root";
    private $password = "";
 
    private function __construct()
    {
        $this->conn = null;
        $this->conn = new mysqli($this->host, $this->username, $this->password, $this->db_name);
 
        if ($this->conn->connect_error) {
            throw new Exception("Connection DB error!");
        }
 
        if (!$this->conn->set_charset("utf8")) {
            throw new Exception("Error loading character set utf8: %s\n", $mysqli->error);
        }
    }
 
    private function __clone()
    {
    }
 
    private function __sleep()
    {
    }
 
    private function __wakeup()
    {
    }
 
    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new ConnectDb();
        }
   
        return self::$instance;
    }
  
    public function getConnection()
    {
        return $this->conn;
    }
}
 
$instance = ConnectDb::getInstance();
$connectionDB = $instance->getConnection();

Ở class trên, các phương thức __construct(), __clone(), __sleep(), __wakeup() tôi để phạm vi truy cập là private để tránh việc khởi tạo đối tượng một cách tùy tiện. Cách duy nhất để khởi tạo đối tượng lúc này là dùng phương thức getInstance(). Hơn nữa nếu bạn gọi nhiều lần phương thức này thì nó cũng không thể khởi tạo nhiều đối tượng, mà nó sẽ kiểm tra sự tồn tại của đối tượng trước khi khởi tạo. Tóm lại, với việc áp dụng Singleton Design Pattern trong ứng dụng, thì ứng dụng sẽ chỉ mở một kết nối duy nhất đến CSDL.

Để lại một trả lời

Hãy trở thành người đầu tiên bình luận!

Thông báo cho
avatar
wpDiscuz