當前位置:首頁 » 編程語言 » php單例模式

php單例模式

發布時間: 2022-01-16 00:21:35

php設計模式中工廠模式和單例模式的區別

工廠模式使用時,返回的對象之間沒有關系。單例模式返回始終是同一個對象。可以在代碼的定義明顯的區分出來,單例模式的構造函數 一般是私有的,不允許實例化,通過內部靜態方法實例化自己,同類型的對象始終返回同一個。

Ⅱ php 單例模式

單例模式是一種常用的軟體設計模式,可以保證系統中一個類只有一個實例,從而達到節約系統資源提升特殊類使用效率的目的


php實現單例模式的方法

classA{
//靜態屬性
privatestatic$_instance;

//空的克隆方法,防止被克隆
privatefunction__clone(){}

//獲取實例
(){
if(!(self::$_instanceinstanceofself)){
self::$_instance=newA();
}
returnself::$_instance;
}
}

//調用
$obj=A::getInstance();

Ⅲ php如何實現單例模式

類的單例模式:
class Single
{
public $rand;
static public $ob;
protected function __construct(){
$this->rand = mt_rand(1000, 99999);
}

static public function getIns(){
if(!Single::$ob){
Single::$ob = new Single();
}
return Single::$ob;
}
}
v(Single::getIns());
v(Single::getIns());

Ⅳ PHP的單例模式有什麼用

給出你的代碼,單例模式一般也就是強調類的靜態調用,一個進程對一個類的多次調用只產生一個類對象,具體你得給出你的類代碼才好幫你修寫,

Ⅳ 什麼是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

Ⅵ php單例模式是怎麼實現的呢

單例模式是一種常用的軟體設計模式。在它的核心結構中只包含一個被稱為單例類的特殊類。

Ⅶ PHP為什麼以及什麼時候使用單例模式

單例模式確保某個類只有一個實例
1.只能有一個實例。
2.必須自行創建這個實例。
3.必須給其他對象提供這一實例。
那麼為什麼要使用PHP單例模式?
PHP一個主要應用場合就是應用程序與資料庫打交道的場景,在一個應用中會存在大量的資料庫操作,針對資料庫句柄連接資料庫的行為,使用單例模式可以避免大量的new操作。因為每一次new操作都會消耗系統和內存的資源。
優點:
1. 改進系統的設計
2. 是對全局變數的一種改進
缺點:
1. 難於調試
2. 隱藏的依賴關系
3. 無法用錯誤類型的數據覆寫一個單例

Ⅷ 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();
}

}

Ⅸ 怎麼用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);

熱點內容
oracle存儲過程定義變數 發布:2024-09-21 10:30:42 瀏覽:382
預編譯的作用 發布:2024-09-21 10:24:48 瀏覽:590
網頁的訪問量 發布:2024-09-21 10:14:46 瀏覽:146
壓縮機阻 發布:2024-09-21 10:12:00 瀏覽:649
du查看文件夾大小 發布:2024-09-21 10:02:00 瀏覽:986
servuftpserver 發布:2024-09-21 09:58:51 瀏覽:387
邁騰引擎配置怎麼樣 發布:2024-09-21 09:39:33 瀏覽:592
懷孕骨演算法 發布:2024-09-21 09:32:58 瀏覽:659
為啥嗶哩嗶哩緩存不了電影 發布:2024-09-21 09:23:56 瀏覽:487
c語言在 發布:2024-09-21 09:21:03 瀏覽:924