PHP經常使用操做類實現——數據庫操做類

概述

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

這一系列文章主要是一些PHP經常使用的類操做,回顧一下面向對象,我一直致力於小白文章的撰寫,由於我也是小白,相信有人須要,但願讀者可以喜歡。php

說明

  • 關於PHP語言實現各類操做類,網上都可以找獲得,可是質量良莠不齊,有的代碼很差懂,有時候看的眼花繚亂,因此我在這裏統一做了一個整理(注意:是整理,每一種操做類,我至少會參考三份優秀代碼,而後本身跑出來,而不是CV)
  • 我會盡可能遵照PSR規範,會有很詳細易懂的註釋
  • 對於其中涉及到的相關知識點,好比設計模式,類型檢測、瀏覽器架構、通訊數據我也會簡單講講,並留下相關連接,但願讀者可以細嚼慢嚥

閱讀準備

內容涉及面向對象、數據庫、文件操做、購物車、分頁、圖像處理、JSON數據接口,你可能須要有一點知識基礎,固然,這些內容都是獨立的,能夠選擇性的參看。mysql

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方法,其實能夠看的出來,實現數據庫操做類很簡單,只須要把數據庫鏈接函數的參數看成類成員變量,而後調用就好了,可是這裏用了一個簡單的設計模式——單例模式,總之加上它,代碼會更便捷、健壯,下面簡單講講。sql

爲何使用單例模式?

其實從技術上考慮主要是考慮節省內存資源(由於訪問數據庫的話咱們實例一次就夠了,不須要重複實例[2019.5.28 update]),提高系統性能,但實際可以感覺到的就是更方便,並且逼格高一些,因此用它。數據庫

什麼是單例模式?

舉個例子,就是大樓只有一個入口,方便控制,用面向對象來講,就是一個類只有一個實例,方便管理。設計模式

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

  1. 首先聲明一個私有構造函數,這樣就不能在外面使用 new 來實例化多個對象了,你能夠用coding 2的代碼試一試,會報錯
  2. 構造一個公共入口來獲取類的實例,總的有實例可用撒,注意這個self指的是當前類,instanceof是檢查當前變量是否爲類的實例

如何檢查單例效果?

你能夠用coding 3的代碼查看輸出結果,而後你會發現構造函數只執行了一次,說明,第一次實例化對象以後,後面的變量對對象的引用是一致的,說明實例實際上只有一個。瀏覽器

爲何getInstance方法是靜態的呢?

函數也是變量,靜態化變量,無論引用多少次,都不會重複生成,比較節省空間,這裏並不考慮多線程的問題。多線程

參考連接

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

結語

有沒懂的或者又以爲不對的,歡迎你們留言。函數

最後

我會把源代碼放在GitHub主頁上,別擔憂,是中文,有須要的能夠訪問下載.性能

相關文章
相關標籤/搜索