概述
謝謝大家的收藏與贊,這是對我最大的鼓勵。
這一系列文章主要是一些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方法,其實可以看的出來,實現資料庫操作類很簡單,只需要把資料庫連線函式的引數當作類成員變數,然後呼叫就行了,但是這裡用了一個簡單的設計模式——單例模式,總之加上它,程式碼會更便捷、健壯,下面簡單講講。
為什麼使用單例模式?
其實從技術上考慮主要是考慮節省記憶體資源,提升系統效能,但實際能夠感受到的就是更方便,而且逼格高一些,所以用它。
什麼是單例模式?
舉個例子,就是大樓只有一個入口,方便控制,用物件導向來說,就是一個類只有一個例項,方便管理。
程式碼部分是怎麼實現單例模式的?
-
首先宣告一個私有建構函式,這樣就不能在外面使用 new 來例項化多個物件了,你可以用coding 2的程式碼試一試,會報錯
-
構造一個公共入口來獲取類的例項,總的有例項可用撒,注意這個self指的是當前類,instanceof是檢查當前變數是否為類的例項
如何檢查單例效果?
你可以用coding 3的程式碼檢視輸出結果,然後你會發現建構函式只執行了一次,說明,第一次例項化物件之後,後面的變數對物件的引用是一致的,說明例項實際上只有一個。
為什麼getInstance方法必須是靜態的呢?
因為例項化物件的方法有兩種,一種是New Class,一種是Class::method,以為private的原因,第一種不能用(private 規定不能在外部引用類成員),所以只能採取第二種方法。
而且函式也是變數,靜態化變數,不管引用多少次,都不會重複生成,比較節省空間,這裡並不考慮多執行緒的問題。
參考連結
PHP 單例模式解析和實戰
PHP 設計模式 單例模式
單例模式5種實現方式
語言中,靜態方法和非靜態方法你懂多少?
結語
有沒懂的或者又覺得不對的,歡迎大家留言。
最後
我會把原始碼放在GitHub主頁上,別擔心,是中文,有需要的可以訪問下載,方便Star的請Star一下吧,我又不要你們錢。
P.S 之前的前言部分太口水化了,沒通過segmentFault稽核,所以在這裡放在了一起。