PHP常用操作類實現——資料庫操作類

entner發表於2017-07-11

概述

謝謝大家的收藏與贊,這是對我最大的鼓勵。

這一系列文章主要是一些PHP常用的類操作,回顧一下物件導向,我一直致力於小白文章的撰寫,因為我也是小白,相信有人需要,希望讀者能夠喜歡。

說明

  • 關於PHP語言實現各種操作類,網上都能夠找得到,但是質量參差不齊,有的程式碼不好懂,有時候看的眼花繚亂,所以我在這裡統一作了一個整理(注意:是整理,每一種操作類,我至少會參考三份優秀程式碼,然後自己跑出來,而不是CV)

  • 我會盡量遵守PSR規範,會有很詳細易懂的註釋

  • 對於其中涉及到的相關知識點,比如設計模式,型別檢測、瀏覽器架構、通訊資料我也會簡單講講,並留下相關連結,希望讀者能夠細嚼慢嚥

閱讀準備

內容涉及物件導向、資料庫、檔案操作、購物車、分頁、影像處理、JSON資料介面,你可能需要有一點知識基礎,當然,這些內容都是獨立的,可以選擇性的參看。

Source Code

<?php
/**
 * TODO:資料庫模型類
 * Author:entner
 * time:   2017-5-6
 * version:1.0
 */

Class DB{
    protected $HOST = `127.0.0.1`;     //主機地址
    protected $DATABASE;               
    protected $USER ="root";           //資料庫使用者名稱
    protected $ROOT ="root";           //資料庫使用者密碼
    private static $resource;          //資料庫連線資源控制程式碼 
    private static  $instance;        //靜態變數儲存類的唯一例項

    /**
     * 建構函式和克隆函式必須宣告為私有的,防止外部獲取
     */
    private function __construct(){    
            echo "hello";
    }

    /**
     * TODO:獲取操作類例項
     * 單例模式:只給一個入口
     * static : 讓連線靜態化,不需要重複宣告
     */
    public static function getInstance(){
        if(!self::$instance instanceof self){
            self::$instance = new self();
        }
        return self::$instance;
    }


    /**
    * TODO:資料庫連線
    * @pagram $dbname string 資料庫名稱
    */
    public function connect($dbname = "mail"){
        $this->DATABASE = $dbname;
        /*    判斷資料庫是否連線     */
        if(!self::$resource){
            self::$resource = mysqli_connect($this->HOST,$this->USER,$this->ROOT,$this->DATABASE);
            /*    如果資料庫連線失敗        */
            if(!self::$resource){
                throw new Execption(`mysql connect error`.mysqli_connect_error());
            }
            /*   設定編碼   */
            mysqli_query(self::$resource,"set names UTF8");
        }
        return self::$resource;
    }



}

/**********Coding 1*********************
$res = DB::getInstance()->connect("base");    
print_r($res);
die;
********************************/


/**********Coding 2*********************
 $res = new DB();
 $res::getInstance()->connect();  
 因為建構函式的私有性,這一句會產生fatal error 錯誤
********************************/


/**********Coding 3*********************
$a = DB::getInstance();
$a->connect();
                        
$b = DB::getInstance();
$b->connect();

echo "<pre>";
print_r($a);
print_r($b);

只會執行一次建構函式,說明$a $b是類的同一個例項
********************************/

解析

如果不看建構函式getInstance方法,其實可以看的出來,實現資料庫操作類很簡單,只需要把資料庫連線函式的引數當作類成員變數,然後呼叫就行了,但是這裡用了一個簡單的設計模式——單例模式,總之加上它,程式碼會更便捷、健壯,下面簡單講講。

為什麼使用單例模式?

其實從技術上考慮主要是考慮節省記憶體資源,提升系統效能,但實際能夠感受到的就是更方便,而且逼格高一些,所以用它。

什麼是單例模式?

舉個例子,就是大樓只有一個入口,方便控制,用物件導向來說,就是一個類只有一個例項,方便管理。

程式碼部分是怎麼實現單例模式的?

  1. 首先宣告一個私有建構函式,這樣就不能在外面使用 new 來例項化多個物件了,你可以用coding 2的程式碼試一試,會報錯

  2. 構造一個公共入口來獲取類的例項,總的有例項可用撒,注意這個self指的是當前類,instanceof是檢查當前變數是否為類的例項

如何檢查單例效果?

你可以用coding 3的程式碼檢視輸出結果,然後你會發現建構函式只執行了一次,說明,第一次例項化物件之後,後面的變數對物件的引用是一致的,說明例項實際上只有一個。

為什麼getInstance方法必須是靜態的呢?

因為例項化物件的方法有兩種,一種是New Class,一種是Class::method,以為private的原因,第一種不能用(private 規定不能在外部引用類成員),所以只能採取第二種方法。
而且函式也是變數,靜態化變數,不管引用多少次,都不會重複生成,比較節省空間,這裡並不考慮多執行緒的問題。

參考連結

PHP 單例模式解析和實戰
PHP 設計模式 單例模式
單例模式5種實現方式
語言中,靜態方法和非靜態方法你懂多少?

結語

有沒懂的或者又覺得不對的,歡迎大家留言。

最後

我會把原始碼放在GitHub主頁上,別擔心,是中文,有需要的可以訪問下載,方便Star的請Star一下吧,我又不要你們錢。
P.S 之前的前言部分太口水化了,沒通過segmentFault稽核,所以在這裡放在了一起。

相關文章