class Config1 {} class Config { * 必須先聲明一個靜態私有屬性:用來保存當前類的實例 * 1. 為什么必須是靜態的?因為靜態成員屬於類,並被類所有實例所共享 * 2. 為什么必須是私有的?不允許外部直接訪問,僅允許通過類方法控制方法 * 3. 為什么要有初始值null,因為類內部訪問接口需要檢測實例的狀態,判斷是否需要實例化 private static $instance = null; //保存用戶的自定義配置參數 private $setting = []; //構造器私有化:禁止從類外部實例化 private function __construct(){} //克隆方法私有化:禁止從外部克隆對象 private function __clone(){} //因為用靜態屬性返回類實例,而只能在靜態方法使用靜態屬性 //所以必須創建一個靜態方法來生成當前類的唯一實例 public static function getInstance() { //檢測當前類屬性$instance是否已經保存了當前類的實例 if (self::$instance == null) { //如果沒有,則創建當前類的實例 self::$instance = new self(); } //如果已經有了當前類實例,就直接返回,不要重復創建類實例 return self::$instance; } //設置配置項 public function set($index, $value) { $this->setting[$index] = $value; } //讀取配置項 public function get($index) { return $this->setting[$index]; } } $obj1 = new Config1; $obj2 = new Config1; var_dump($obj1,$obj2); echo '<hr>'; //實例化Config類 $obj1 = Config::getInstance(); $obj2 = Config::getInstance(); var_dump($obj1,$obj2); $obj1->set('host','localhost'); echo $obj1->get('host');
* 單例模式:一個類僅允許創建一個實例
一、什么是單例模式 作為對象的創建模式,單例模式確保某一個類只有一個實例,並且對外提供這個全局實例的訪問入口。它不會創建實例副本,而是會向單例類內部存儲的實例返回一個引用。
二、PHP單例模式三要素 1. 需要一個保存類的唯一實例的靜態成員變量。 2. 構造函數和克隆函數必須聲明為私有的,防止外部程序創建或復制實例副本。 3. 必須提供一個訪問這個實例的公共靜態方法,從而返回唯一實例的一個引用。
三、為什么使用單例模式 使用單例模式的好處很大,以數據庫操作為例。若不采用單例模式,當程序中出現大量數據庫操作時,每次都要執行new操作,
每次都會消耗大量的內存資源和系統資源,而且每次打開和關閉數據庫連接都是對數據庫的一種極大考驗和浪費。使用了單例模式,只需要實例化一次,不需要每次都執行new操作,極大降低了資源的耗費。
四、單例模式示例 這里以數據庫操作為例
<?php /** * 單例模式 **/ class Db { //保存全局實例 private static $instance; //數據庫連接句柄 private $db; //數據庫連接參數 const HOSTNAME = "127.0.0.1"; const USERNAME = "root"; const PASSWORD = "root"; const DBNAME = "testdb"; //私有化構造函數,防止外界實例化對象 private function __construct() { $this->db = mysqli_connect(self::HOSTNAME,self::USERNAME, self::PASSWORD,self::DBNAME); } //私有化克隆函數,防止外界克隆對象 private function __clone() { } //單例訪問統一入口 public static function getInstance() { if(!(self::$instance instanceof self)) { self::$instance = new self(); } return self::$instance; } //數據庫查詢操作 public function getinfo() { $sql = "select * from testtb"; $res = mysqli_query($this->db,$sql); while($row = mysqli_fetch_array($res)) { echo $row['testcol'] . '<br />'; } mysqli_free_result($res); } } $mysqli = Db::getInstance(); $mysqli->getinfo(); ?>
