[英]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() {}
}
重要的是:
因此,從其他類調用此數據庫連接為:
$db=DataBase::getInstance();
不像
$db=new DataBase();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.