簡體   English   中英

MySQLi Singleton

[英]MySQLi Singleton

這足以在php中使單例嗎?

public static function getInstance() {
   if (!isset(self::$intance)) {
     self::$instance = new mysqli(DB_HOST, DB_USER, DB_PWD, DB_NAME);
   }
   return self::$instance;
 }

我發現它是最簡單的方法,比在這里看到的任何東西都要容易。 可能有任何問題嗎?

用我自己的一份整合評論中的更改。 不必依賴常量,而是將變量傳遞到getInstance / constructor中,以便您可以按照自己喜歡的方式存儲憑據,並將其輸入到類中,而不必使類依賴於以某種方式存儲的數據。 增加了一點靈活性。

您還可以將其替換為代碼以從配置文件中讀取它們,或從服務定位器類型模式中提取數據。

Class MysqlConnection {
  private static $instance = null;
  private function __construct() {
    self::$instance = new mysqli(DB_HOST,DB_USER,DB_PASS,DB_DATABASE);
  }

  public static function getInstance() {
    if (!isset(self::$instance)) {
      $credentials = self::getCredentials();
      self::$instance = new MysqlConnection();
    }
      return self::$instance;
    }
  }

  function __clone() {
    //Throw exception/custom exception type here.
  }
}

編輯評論:這個想法不是在這里概述課程的全部100%使用情況,而是代表我對此的立場和方法。 憑證位不是100%必需的,這只是我的想法,使它更具靈活性,而不是硬編碼它以僅使用CONSTANTS等。這可能會偏離最初的觀點,這就是單例的樣子。 對此我感到抱歉。

您不能使原始的mysqli類成為單例-這實際上是一件好事,因為單例是邪惡的(如果需要,我會詳細介紹)。

從技術上講,您執行的操作稱為靜態工廠方法,該方法僅返回數據庫對象的第一個創建的實例。 實際上,這比使用單例要好得多,因為您可能還會刪除該實例以進行測試以創建另一個實例,以及另一個實例...

但是根據我的經驗,您通常很高興能在代碼中使用一種以上的數據庫連接。 只需考慮使用兩個用戶帳戶,一個用於管理員,另一個用於常規使用。 僅此一項就可以視為兩個數據庫連接,並且如果您的代碼只能處理“唯一的一個實例”而沒有選擇登錄憑據,那將是一件很糟糕的事情。 我建議反對。

這是單例類:

class DataBase
{
  private static $mysqli;

  final private function __construct() {}

  public static function getInstance()
  {
    if (!is_object(self::$mysqli)) self::$mysqli = new mysqli($H,$U,$P,$B);
    return self::$mysqli;
  }

  private function __destruct()
  {
    if (self::$mysqli) self::$mysqli->close();
  }

  private function __clone() {}
}

重要的是:

  • 變量(存儲數據庫連接)是靜態的
  • 構造函數是私有的(無法調用)(無法覆蓋的最終函數)
  • 函數返回對象也是靜態的(通常是這里的getInstance函數)
  • 不允許克隆單例類,因此__clone()函數必須為空
  • 垃圾回收器調用析構函數__destruct並應確定狀態

因此,從其他類調用此數據庫連接為:

$db=DataBase::getInstance();

不像

$db=new DataBase();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM