php單例模式代碼
A. 你熟悉的設計模式有哪些寫出單例模式的實現代碼
23個設計模式:
根據目的設計模式可以分為創造模式,結構模式和行為模式,創建模式用於處理對象的創建。結構模式用於處理類或對象的組合。
行為模式用於描述類或對象如何交互以及如何分配職責,創建模式用於處理對象的創建。主要包括以下五種設計模式:
工廠方法模式()
抽象工廠模式(AbstractFactoryPattern)
建造者模式(BuilderPattern)
原型模式(PrototypePattern)
單例模式(SingletonPattern)
結構模式用於處理類或對象的組合,包括以下七個設計模式:
適配器模式(AdapterPattern)
橋接模式(BridgePattern)
組合模式(CompositePattern)
裝飾者模式(DecoratorPattern)
外觀模式(FacadePattern)
享元模式(FlyweightPattern)
代理模式(ProxyPattern)
行為模式描述類或對象如何交互以及它們如何分配職責。它由以下11種設計模式組成:
責任鏈模式(Chain的ResponsibilityPattern)
命令模式(CommandPattern)
解釋器模式(InterpreterPattern)
迭代器模式(IteratorPattern)
中介者模式(MediatorPattern)
備忘錄模式(MementoPattern)
觀察者模式(ObserverPattern)
狀態模式(StatePattern)
策略模式(StrategyPattern)
模板方法模式(TemplateMethodPattern)
訪問者模式(VisitorPattern)
單例模式實現1:
公共類Singleton{
類共享實例對象
私有靜態單例;單例=零;
//私有構造函數
私有Singleton(){
系統。出去了。這是單例!!);
}
//獲取單例方法
公共同步靜態單例getInstance(){
//確定共享對象是否為空,如何空一個新對象
If(singleton==null){
singleton=newsingleton();
}
返回單例。
}
}
單例模式實現2:
公共類Singleton{
類共享實例對象實例化
=newSingleton();
//私有構造函數
私有Singleton(){
系統:出去了,這是單例!!);
}
//獲取單例方法
公共靜態單例getInstance(){
直接返回共享對象
返回單例。
}
}
(1)php單例模式代碼擴展閱讀:
注意事項:
設計模式主要分三個類型:創建型和行為型。
Singleton:確保一個類只有一個實例,並為其提供一個全局訪問點
AbstractFactory:提供一個介面,用於創建一系列相關或相互依賴的對象,而無需指定它們的具體類。
FactoryMethod:定義一個用於創建對象的介面,並讓子類決定實例化哪個類。工廠方法將類的實例化延遲到子類。
Builder:將復雜對象的構造與其表示分離,使相同的構造過程可以創建不同的表示。
Prototype:指定要使用Prototype實例創建的對象的類型,並復制該原型來創建一個新對象。
Composite:將對象組合成樹狀結構,以表示整體各部分之間的關系。組合使用戶一致地使用單個對象和組合對象。
Facade:為子系統fa中的一組介面提供一致的介面。Ade提供了一個高級介面,使子系統更易於使用。
Proxy:為其他對象提供一個代理,以控制對該對象的訪問
Adapter:將一個介面類轉換為客戶想要的另一個介面類。適配器模式使那些由於介面不兼容而無法一起工作的類一起工作。
Decrator:式比子類化更靈活,可以為對象動態添加一些額外的職責。
Bridge:模式將抽象部分與其實現部分分離,以便它們可以獨立地更改。
Flyweight:享元模式
B. php設計模式中工廠模式和單例模式的區別
工廠模式使用時,返回的對象之間沒有關系。單例模式返回始終是同一個對象。可以在代碼的定義明顯的區分出來,單例模式的構造函數 一般是私有的,不允許實例化,通過內部靜態方法實例化自己,同類型的對象始終返回同一個。
C. php 單例模式 不明白$ins 是什麼意思 沒理解了在單例中是怎麼發生的作用
單例的作用是保證在類被調用的時候只被實例化一次
並且每次調用的都是該被實例化的類
作用可以思考,一個資料庫鏈接,在一次訪問中只需要一個資料庫鏈接,並不應該產生多個資料庫鏈接
實現的方式是通過聲明一個靜態變數,用來存儲唯一的實例化對象
類被調用的方式不是童工new的實例化調用,為了保證不在外部被實例化,所以需要將__construct()實例化函數設置為私有或者子類繼承,通過統一的調用介面調用,在你的例子裡面就是getlns
該函數中判斷了靜態變數是否是滿足自身的介面設定,不滿足則實例化自己
你的代碼在return $this->data[$key];這句應該是錯誤的
整個getlns應該改為如下
public static function getIns(){
if(!self::$ins instanceof self ){
self::$ins = new self():
}
return self::$ins;
}
你估計是寫錯了函數,你可以發現你的getlns中沒喲$key變數,但內部卻調用了,所以你應該再檢查下你寫的代碼
D. 為什麼要使用PHP單例模式及應用實例
單例模式顧名思義,就是只有一個實例。作為對象的創建模式, 單例模式確保某一個類只有一個實例,而且自行實例化並向整個系統提供這個實例,這個類我們稱之為單例類。單例模式的要點有三個:一是某個類只能有一個實例;二是它必須自行創建這個實例;三是它必須自行向整個系統提供這個實例。下面我們討論下為什麼要使用PHP單例模式?多數人都是從單例模式的字面上的意思來理解它的用途, 認為這是對系統資源的節省, 可以避免重復實例化, 是一種"計劃生育". 而PHP每次執行完頁面都是會從內存中清理掉所有的資源. 因而PHP中的單例實際每次運行都是需要重新實例化的, 這樣就失去了單例重復實例化的意義了. 單單從這個方面來說, PHP的單例的確有點讓各位失望. 但是單例僅僅只有這個功能和應用嗎? 答案是否定的,我們一起來看看。1. php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 在使用面向對象的方式開發時(廢話), 如果使用單例模式, 則可以避免大量的new 操作消耗的資源。2. 如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現. 這個可以參看zend Framework的FrontController部分。3. 在一次頁面請求中, 便於進行調試, 因為所有的代碼(例如資料庫操作類db)都集中在一個類中, 我們可以在類中設置鉤子, 輸出日誌,從而避免到處var_mp, echo。
E. 怎麼用php實現單例模式
類內使用方法,類似
public static function getInstance($class_name){
if(! isset(static::$classList[$class_name])){
static::$classList[$class_name] = new $class_name;
}
return static::$classList[$class_name];
}
實例化
(className)::getInstance($class_name);
F. PHP設計模式之單例模式
單例模式
:使得類的一個對象成為系統中的唯一實例.
PHP中使用單例模式最常見的就是資料庫操作了。避免在系統中有多個連接資料庫的操作,浪費系統資源的現象,就可以使用單例模式。每次對資料庫操作都使用一個實例。
簡單示例
class
AClass
{
//
用來存儲自己實例
public
static
$instance;
//
私有化構造函數,防止外界實例化對象
private
function
__construct()
{}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
//
靜態方法,單例訪問統一入口
public
static
function
getInstance()
{
if
(!(self::$instance
instanceof
self)){
self::$instance
=
new
self();
}
return
self::$instance;
}
//
test
public
function
test()
{
return
"done";
}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
}
class
BClass
extends
AClass{
}
//
獲取實例
$aclass
=
AClass::getInstance();
$bclass
=
BClass::getInstance();
//
調用方法
echo
$aclass->test();
對一些比較大型的應用來說,可能連接多個資料庫,那麼不同的資料庫公用一個對象可能會產生問題,比如連接句柄的分配等,我們可以通過給$instance變成數組,通過不同的參數來控制
簡單示例
class
DB
{
//
用來存儲自己實例
public
static
$instance
=
array();
public
$conn;
//
私有化構造函數,防止外界實例化對象
private
function
__construct($host,
$username,
$password,
$dbname,
$port)
{
$this->conn
=
new
mysqli($host,
$username,
$password,
$dbname,
$port);
}
//
靜態方法,單例訪問統一入口
public
static
function
getInstance($host,
$username,
$password,
$dbname,
$port)
{
$key
=
$host.":".$port;
if
(!(self::$instance[$key]
instanceof
self)){
self::$instance[$key]
=
new
self($host,
$username,
$password,
$dbname,
$port);#實例化
}
return
self::$instance[$key];
}
//query
public
function
query($ql)
{
return
$this->conn->query($sql);
}
//
私有化克隆函數,防止外界克隆對象
private
function
__clone()
{}
//釋放資源
public
function
__destruct(){
$this->conn->close();
}
}
G. PHP中幾種常見的開發模式
單例模式
$_instance必須聲明為靜態的私有變數
構造函數和析構函數必須聲明為私有,防止外部程序new 類從而失去單例模式的意義
getInstance()方法必須設置為公有的,必須調用此方法 以返回實例的一個引用
::操作符只能訪問靜態變數和靜態函數
new對象都會消耗內存
使用場景:最常用的地方是資料庫連接。
使用單例模式生成一個對象後, 該對象可以被其它眾多對象所使用。
私有的__clone()方法防止克隆對象
- * 如果某個類在很多的文件中都new ClassName(),那麼萬一這個類的名字
- * 發生變更或者參數發生變化,如果不使用工廠模式,就需要修改每一個PHP
- * 代碼,使用了工廠模式之後,只需要修改工廠類或者方法就可以了。
單例模式,使某個類的對象僅允許創建一個。構造函數private修飾,
申明一個static getInstance方法,在該方法里創建該對象的實例。如果該實例已經存在,則不創建。比如只需要創建一個資料庫連接。
工廠模式
工廠模式,工廠方法或者類生成對象,而不是在代碼中直接new。
使用工廠模式,可以避免當改變某個類的名字或者方法之後,在調用這個類的所有的代碼中都修改它的名字或者參數。
注冊模式
注冊模式,解決全局共享和交換對象。已經創建好的對象,掛在到某個全局可以使用的數組上,在需要使用的時候,直接從該數組上獲取即可。將對象注冊到全局的樹上。任何地方直接去訪問。
策略模式
策略模式,將一組特定的行為和演算法封裝成類,以適應某些特定的上下文環境。
eg:假如有一個電商網站系統,針對男性女性用戶要各自跳轉到不同的商品類目,並且所有的廣告位展示不同的廣告。在傳統的代碼中,都是在系統中加入各種if else的判斷,硬編碼的方式。如果有一天增加了一種用戶,就需要改寫代碼。使用策略模式,如果新增加一種用戶類型,只需要增加一種策略就可以。其他所有的地方只需要使用不同的策略就可以。
首先聲明策略的介面文件,約定了策略的包含的行為。然後,定義各個具體的策略實現類。
執行結果圖:
總結:
通過以上方式,可以發現,在不同用戶登錄時顯示不同的內容,但是解決了在顯示時的硬編碼的問題。如果要增加一種策略,只需要增加一種策略實現類,然後在入口文件中執行判斷,傳入這個類即可。實現了解耦。
實現依賴倒置和控制反轉(有待理解)
通過介面的方式,使得類和類之間不直接依賴。在使用該類的時候,才動態的傳入該介面的一個實現類。如果要替換某個類,只需要提供一個實現了該介面的實現類,通過修改一行代碼即可完成替換。
觀察者模式
1:觀察者模式(Observer),當一個對象狀態發生變化時,依賴它的對象全部會收到通知,並自動更新。
2:場景:一個事件發生後,要執行一連串更新操作。傳統的編程方式,就是在事件的代碼之後直接加入處理的邏輯。當更新的邏輯增多之後,代碼會變得難以維護。這種方式是耦合的,侵入式的,增加新的邏輯需要修改事件的主體代碼。
3:觀察者模式實現了低耦合,非侵入式的通知與更新機制。
定義一個事件觸發抽象類。
當某個事件發生後,需要執行的邏輯增多時,可以以松耦合的方式去增刪邏輯。也就是代碼中的紅色部分,只需要定義一個實現了觀察者介面的類,實現復雜的邏輯,然後在紅色的部分加上一行代碼即可。這樣實現了低耦合。
裝飾器模式
1:裝飾器模式,可以動態的添加修改類的功能
2:一個類提供了一項功能,如果要在修改並添加額外的功能,傳統的編程模式,需要寫一個子類繼承它,並重寫實現類的方法
3:使用裝飾器模式,僅需要在運行時添加一個裝飾器對象即可實現,可以實現最大額靈活性。
H. PHP CI框架self::$instance =& $this;
&簡單點可以理解成C語言的& 但是有點差別,$this 實例化的這個類. static instance指向的這個實例.這就是一個單例模式. 所有的代碼 只要調用 classname::getInstance()就可以獲得這個類的實例.
I. php 單例模式
單例模式是一種常用的軟體設計模式,可以保證系統中一個類只有一個實例,從而達到節約系統資源提升特殊類使用效率的目的
php實現單例模式的方法
classA{
//靜態屬性
privatestatic$_instance;
//空的克隆方法,防止被克隆
privatefunction__clone(){}
//獲取實例
(){
if(!(self::$_instanceinstanceofself)){
self::$_instance=newA();
}
returnself::$_instance;
}
}
//調用
$obj=A::getInstance();
J. 什麼是PHP單例模式
PHP單例模式,就是一個對象只被生成一次,但該對象可以被其它眾多對象使用。單例模式使用最多的場景,是資料庫連接操作。我們知道,生成一個對象的操作是用new函數來實現,但是new對象都會消耗內存,而且有時候對同一個對象,在不同文件中可能會生成多次,這就造成了系統資源的浪費。然而使用單例模式,則可以很好的避免這種情況。
以資料庫為例,假設我們有一個資料庫的類,要實現資料庫連接。如果不使用單例模式,那麼在很多PHP文件中,我們可能到要創建這樣的一個連接,這其實是對資源的很大浪費。那麼下面介紹單例模式實現方法:
classDatabase
{
//定義一個屬性,該屬性是靜態的保護或私有屬性
protectedstatic$db;
//這里構造函數一定要是私有方法
privatefunction__construct()
{
}
//聲明一個獲取類實例的方法
staticfunctiongetInstace()
{
if(self::$db){
returnself::$db;
}else{
//生成自己
self::$db=newself();
returnself::$db;
}
}
}
//錯誤調用方法
//用new實例化private標記構造函數的類會報錯
$db=newDatabase();
//正確獲取實例方法
$db=Database::getInstace();
使用單例模式的好處是,當你在其他地方也要使用到這個類,比如上面的資料庫類。那麼你可以在其它地方直接調用Database::getInstace(),而且該實例只會被生成一次,不會被重復生成,所以不會浪費系統資源。
簡單的說,單例模式生成的實例只被生成一次,而且只負責一個特定的任務。
使用單例模式有下面幾個要求:
1.構造函數需要標記為private(訪問控制:防止外部代碼使用new操作符創建對象),單例類不能在其他類中實例化,只能被其自身實例化;
2.擁有一個保存類的實例的靜態成員變數;
3.擁有一個訪問這個實例的公共的靜態方法(常用getInstance()方法進行實例化單例類,通過instanceof操作符可以檢測到類是否已經被實例化);
4.如果嚴謹的話,還需要創建__clone()方法防止對象被復制(克隆)。(我上面沒創建)
使用單例模式好處,總結:
1、php的應用主要在於資料庫應用, 所以一個應用中會存在大量的資料庫操作, 使用單例模式, 則可以避免大量的new 操作消耗的資源。
2、如果系統中需要有一個類來全局控制某些配置信息, 那麼使用單例模式可以很方便的實現. 這個可以參看ZF的FrontController部分。
3、在一次頁面請求中, 便於進行調試。
參考:http://coderschool.cn/1523.html