Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mẫu lớp MySQLi cho kết nối, đóng, để mở?

Tôi sẽ coi đó không phải là một thực hành tốt. Điều đó đặc biệt vì một lý do:vấn đề bạn mô tả tại sao bạn nghĩ rằng bạn cần nó:Chỉ một kết nối cho mỗi yêu cầu.

Bạn không cần phải viết mã bất cứ thứ gì. mysqli có một tính năng hay, kết nối mặc định. Nó chọn các tham số kết nối cơ sở dữ liệu từ cài đặt ini (cấu hình) mỗi khi bạn tạo một phiên bản mới:

$db = new mysqli;

Vì tất cả các kết nối cơ sở dữ liệu bị đóng khi tập lệnh kết thúc, nên không có nhiều điều cần quan tâm. Điều duy nhất bạn cần làm là khởi tạo kết nối một lần và chuyển biến xung quanh cho tất cả mã cần mysqli đó đối tượng.

Một phương pháp không tốt khác là bạn đang giới thiệu Singleton ở đây, một cái gì đó như:

class MysqliSingleton extends mysqli
{
    private static $instance;
    /**
     * @return MysqliSingleton
     */
    public function getInstance()
    {
        if (NULL === self::$instance)
            self::$instance = new self();
        return self::$instance;
    }
    private function __construct()
    {
    }
    public function __clone()
    {
         throw new RuntimeException('Clone is not allowed.');
    }
    public function __wakeup()
    {
        throw new RuntimeException('Unserializing is not allowed.');
    }
}

Nó sẽ hoạt động như thế này:

$mysqli = MysqliSingleton::getInstance();

và sẽ luôn trả về một phiên bản mysqli đó, đó có thể là những gì bạn đang tìm kiếm. Tuy nhiên Singletons được coi là có hại vì chúng có thể gây ra nhiều vấn đề, hãy xem câu hỏi liên quan Ai cần singletons? .

Sẽ dễ dàng hơn khi bạn tạo cho mình một biến mà bạn chuyển xung quanh có chứa cá thể cơ sở dữ liệu. Ngoài ra, bạn có thể đóng gói một số loại tải chậm trong trường hợp ứng dụng của bạn không phải lúc nào cũng cần kết nối mysqli, ví dụ:với một lớp ngữ cảnh rất đơn giản:

interface ContextMysqli
{
    /**
     * @return mysqli
     */
    public function getMysqli();
}

class Context implements ContextMysqli
{
    private $mysqli;
    public function getMysqli()
    {
        $this->mysqli || $this->mysqli = new mysqli();
        return $this->mysqli;
    }
}

Khi các tập lệnh của bạn bắt đầu, chỉ cần khởi tạo ngữ cảnh của bạn và chuyển nó vào mọi phần của mã khi bạn cần:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Đề xuất này cũng có thể hơi thiển cận, nhưng nó tốt hơn một singleton trong khi không giới thiệu nhiều quảng cáo. Lợi ích là bạn đã đóng gói logic khi nào tạo mysqli đối tượng w / o sự cần thiết của một singleton. Mã của bạn hiện độc lập với ngữ cảnh toàn cầu hoặc tĩnh.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL MOD () bị hỏng:Đây có phải là giải pháp thay thế tốt nhất không?

  2. MySQL Workbench có được quyền truy cập để quản trị?

  3. Tối ưu hóa hiệu suất MySQL / MariaDB với công cụ MySQLTunner

  4. Lỗi:ER_WRONG_VALUE_COUNT_ON_ROW:Số cột không khớp với số giá trị ở hàng 1

  5. MySQL CASE để cập nhật nhiều cột