用單例模式建立一個數據庫連接

理解php單例模式

一、什麼是單例

wiki百科:單例模式,也叫單子模式,是一種常用的軟件設計模式。 在應用這個模式時,單例對象的類必須保證只有一個實例存在。 許多時候整個系統只需要擁有一個的全局對象,這樣有利於我們協調系統整體的行爲。

二、爲什麼用單例

實際項目中像數據庫查詢,日誌輸出,全局回調,統一校驗等模塊。這些模塊功能單一,但需要多次訪問,如果能夠全局唯一,多次複用會大大提升性能。這也就是單例存在的必要性。

三、單例模式的好處

1:減少頻繁創建,節省了cpu。

2:靜態對象公用,節省了內存。

3:功能解耦,代碼已維護。

四、如何設計單例

通過上面的描述,單例的核心是,實例一次生成,全局唯一,多次調用。因此在單例模式必須包含三要素:

1:私有化構造函數,私有化clone。也就是不能new,不能clone。【唯一】

2:擁有一個靜態變量,用於保存當前的類。【唯一如何保存】

3:提供一個公共的訪問入口。【可以訪問】

五、建立數據庫連接

PS:功能上不太完整,以後再補充**__**

/**
 * 單例模式連接數據庫--面向對象
 * */
//final關鍵字阻止此類被繼承
final class sql2
{
    static $instance;
    static $connect;
    protected $result;

    //protected關鍵字阻止此類在外部進行實例化
    protected function __construct($host, $user, $password)
    {
        self::$connect = @new mysqli($host, $user, $password);
        if (self::$connect->connect_errno) {
            die(iconv('gbk', 'utf-8', self::$connect->connect_error) . '(' . self::$connect->connect_errno . ')');
        }
    }

    //protected關鍵字阻止此類在外部進行克隆
    protected function __clone()
    {
    }

    //當對象被銷燬時關閉連接
    function __destruct()
    {
        self::$connect->close();
    }

    //獲取實例
    static function getInstance($host, $user, $password)
    {
        self::$instance = self::$instance ?: new self($host, $user, $password);
        return self::$instance;
    }

    //選擇數據庫
    function set_db($db)
    {
        if (!self::$connect->select_db($db)) {
            die(iconv('gbk', 'utf-8', self::$connect->error) . '(' . self::$connect->errno . ')');
        }
    }

    //執行SQL語句
    function query($query)
    {
        if (!($re = self::$connect->query($query))) {
            die(iconv('gbk', 'utf-8', self::$connect->error) . '(' . self::$connect->errno . ')');
        }
        $this->result = $re;
        return $re;
    }

    //以數組形式返回查詢結果
    function fetch_arr($query)
    {
        $re = $this->query($query);
        $res = [];
        while ($row = $re->fetch_assoc()) {
            $res[] = $row;
        }
        return $res;
    }

    //獲取記錄數
    function get_row()
    {
        return $this->result->num_rows;
    }
}

$ins = sql2::getInstance('127.0.0.1', 'root', 'root');
$ins->set_db('houtai');
$re = $ins->fetch_arr('select * from user  ');
//var_dump($re);
$ins->get_row();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章