深入理解PHP單例模式的實現&static&clone
前提
提到單例模式,那就不得不說設計模式。
單例模式是最簡單的一種設計模式,提供了一種唯一訪問其物件的方式,可以直接訪問。
屬於建立型模式
實現之前,我們先要明白兩個關鍵字的原理
static
- 宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。靜態屬性不能通過一個類已例項化的物件來訪問(但靜態方法可以)。
- 函式體中的靜態變數與全域性中的靜態變數不衝突,只有在關鍵字global作用下才會使區域性與全域性統一
- 函式體中的靜態變數在函式呼叫的時候只會被初始化一次
- 靜態方法可以呼叫靜態屬性,禁止呼叫非靜態屬性
- class::method()呼叫本方法所在類,static::method()呼叫最後定義的方法
靜態變數和全域性變數均存放於全域性區,程式結束後仍存於記憶體
也就是說,當我們定義了一個靜態變數,就可以在全域性訪問它的屬性
clone
建立一個物件的副本。
只有在使用clone關鍵字時,__clone方法才會被呼叫
<?php class A { public function __clone() { echo "clone function is being used" . "\n"; } public $a; } $classA = new A(); $classB = $classA; $classC = clone $classA; echo "A === B ? :" . ($classA === $classB ? 'true' : 'false') . "\n"; echo "A === C ? :" . ($classA === $classC ? 'true' : 'false') . "\n"; ?>
php的clone()方法對一個物件例項進行的淺複製,物件內的基本數值型別進行的是傳值複製,而物件內的物件型成員變數,如果不重寫clone方法,顯式的clone這個物件成員變數的話,這個成員變數就是傳引用複製,而不是生成一個新的物件.
淺複製時,屬性為物件的,屬性值仍然指向同一個變數地址
深複製則兩者完全無關,通過 __clone 方法將物件屬性加上重賦值
或者 在複製時使用unserialize(serialize($obj));
因此在複製的過程中我們需要注意,它究竟是淺複製還是深複製
單例模式實現
OK,利用以上的關鍵字,我們就可以設計出一個比較合理的單例模式,將建構函式和__clone函式設為私有防止外界例項化或者克隆物件。
class InstanceClass
{
private static $instances;
private function __construct()
{
}
private function __clone()
{
}
/**
* @return static
*/
public static function getInstance()
{
if (!isset(self::$instances)) {
self::$instances = new $InstanceClass;
}
return self::$instances;
}
}
只能通過getInstance方法來呼叫物件
但其實這樣還是不完善,如何解決多執行緒單例模式,以及在多繼承中使用單例等等
這裡就不多說啦~~~~~
哈哈
相關推薦
深入理解PHP單例模式的實現&static&clone
前提 提到單例模式,那就不得不說設計模式。 單例模式是最簡單的一種設計模式,提供了一種唯一訪問其物件的方式,可以直接訪問。 屬於建立型模式 實現之前,我們先要明白兩個關鍵字的原理 static 宣告類屬性或方法為靜態,就可以不例項化類而直接訪問。靜態屬性不能通過一
php單例模式實現物件只被建立一次
這是我在php面試題中遇到的一道試題,單例模式按字面來看就是某一個類只有一個例項,這樣做的好處還是很大的,比如說資料庫的連線,我們只需要例項化一次,不需要每次都去new了,這樣極大的降低了資源的耗費。 單例類至少擁有以下三種公共元素: 必須擁有一個建構函式,並
深入理解 JavaScript 單例模式 (Singleton Pattern)
概念 單例模式,也叫單子模式,是一種常用的軟體設計模式。在應用這個模式時,單例物件的類必須保證只有一個例項存在。 核心:確保只有一個例項,並提供全域性訪問。 實現思路 一個類能返回物件一個引用(永遠是同一個)和一個獲得該例項的方法(必須是靜態方法,通常命名為getIntance);當我們呼叫這個方法時,類
PHP 簡單理解單例模式和static 關鍵字
php單例模式 單例模式,是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個例項。即一個類只有一個物件例項。 要點主要有三個: 1.一個類只能有一個物件; 2.必須是自行建立這個類的物件; 3,要想整個系統提供
PHP 單例模式優點意義及如何實現
一、什麼是單例模式? 1、含義 作為物件的建立模式,單例模式確保某一個類只有一個例項,而且自行例項化並向整個系統全域性地提供這個例項。它不會建立例項副本,而是會向單例類內部儲存的例項返回一個引用。 2、單例模式的三個要點: (1). 需要一個儲存類
PHP 單例模式 工廠模式 策略模式程式碼理解
//單個類 單例 <?php /** *單例模式:一個類只能有一個物件 *三私一公 */ class MySQLDB { private static $instance; //私有的成員用來儲存類的例項 private function __construct()
PHP中單例模式實現
class SingleInstance{ private function _construct(){ } private static $instance; private fun
[js高手之路]設計模式系列課程-單例模式實現模態框
ges 點擊 eat abs select nbsp str osi 控制 什麽是單例呢? 單,就是一個的意思。例:就是實例化出來的對象,那合在一起就是保證一個構造函數只能new出一個實例,為什麽要學習單例模式呢?或者說單例模式有哪些常見的應用場景.它的使用還是很廣泛,比如
單例模式實現
鎖定 word nal ron 單例模式 tin public 原子操作 == 靜態內部類(static nested class) 優先考慮 public class LazySingleton{ private LazySingleton(){}
Java的單例模式實現
java 單例模式 只能生成一個實例的類是實現了Singleton(單例)模式的類。以下為C#實現單例模式的方式方式一只使用於單線程環境// 把構造函數設為私有函數以禁止他人創建實例 // 定義一個靜態的實例,在需要的時候創建該實例 // 在Singleton的靜態屬性Instance中,只有
php單例模式
sta 導致 一是 所有 代碼 fig 數量 方法 具體實現 php單例模式 單例模式,是一種常用的軟件設計模式。在它的核心結構中只包含一個被稱為單例的特殊類。通過單例模式可以保證系統中一個類只有一個實例。即一個類只有一個對象實例。 要點主要有三個: 1.一個類只能有一個對
PHP單例模式簡記
結果 隱私 php單例模式 tin ont st2 受保護 src 如何實現 單例模式:只能實例化一次即為單例模式 如何實現只能實例化一次:突破口在於類的構造函數,我們把構造方法變為隱私或者受保護的方法,然後執行代碼 <?php Class Temp {
Java單例模式&static成員變量 區別
instance .net 技術分享 static成員 使用 過程 () http 一加 當需要共享的變量很多時,使用static變量占用內存的時間過長,在類的整個生命周期。 而對象只是存在於對象的整個生命周期。 //餓漢式 class Sing
c#之使用單例模式實現數據庫連接
strings instance ssl div lock config onf 鎖定 特殊 1、使用程序集Oracle.ManagedDataAccess.dll using Oracle.ManagedDataAccess.Client; using System.Co
模板方法模式 + 觀察者模式 + 簡單工廠模式 + 單例模式實現一個簡單的數據表讀寫
private 數據庫鏈 obs imp 通知 model 數據表 ring pri 實現功能: 對數據表的讀要緩存起來,對數據表的寫需要清除緩存. 數據表根據屬性字段來決定是否緩存 可以更換數據庫鏈接方式,比如可以隨時更換為mysql或mysqli() 當插入數據時給出一
設計模式之單例模式實現(C++)
pan sin ace pen bsp ati one delet friend #ifndef SINGLETON_H #define SINGLETON_H #include <cassert> #include <memory> #incl
單例模式實現方法之懶漢式、餓漢式
項目 只有一個 接下來 程序設計 選擇 bsp 私有 syn 屬性 Singleton 單例模式是一種經常在項目開發中使用的程序設計模式,它用於創建一個全局共享的實例對象。該實例對象在整個應用程序中只有一個,不會出現更多的該實例對象。 實現原理就是將類的構造方法私有化,即使
php 單例模式封裝MySQL類
function RR sqli self () tab pub con 實例化 class MysqlConn { //定義一個私有的靜態屬性,用來存放實例化的對象 private static $dbcon; //定義一個私有的靜態屬性,用來存在數據庫的連接
php 單例模式
span php sql gb2312 pre 連接 ceo 單例 數據 單例模式當需要保證某個對象只能有一個實例的時候,單例模式非常有用。它把創建對象的控制權委托到一個單一的點上,任何時候應用程序都只會僅有一個實例存在。 單例模式中必須包含:private 的構造函數、靜
php單例模式之“三私一公”
外部 特點 概念 失去 spa get ins 應用 而且 單例模式的概念 單例模式是指整個應用中某個類只有一個對象實例的設計模式。具體來說,作為對象的創建方式,單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統全局的提供這個實例。它不會創建實例副本,而是會向單