php物件導向之單例模式 125

2021-06-23 06:43:07 字數 2568 閱讀 6143

**:燕十八

<?php 

/****

燕十八 公益php講堂

論 壇:

微 博:

yy頻道: 88354001

****/

/***

====筆記部分====

單例模式

先看場景:

多人協同開發, 都要呼叫mysql類的例項

如果用svn知道,好多人一起開發,再提交各自的檔案.

a: $mysql = new mysql();

$mysql->query....

測試通過

b: $db = new mysql();

測試通過

...

...

兩人的**要合到一塊,如下

$mysql = new mysql();

$mysql->query....

$db = new mysql();

兩個mysql類的例項,

而且,每new一下,還要連線一次資料庫.

顯然,乙個頁面呢,有乙個mysql類的例項就夠了.

如果限制,讓多人開發,無論你怎麼操作,只能得到乙個物件呢?

1:開會時,經理說:有乙個$db變數,是系統自動初始化的,就是mysql類的例項.

大家都用他.誰敢new mysql(),開除.

2:這是行政手段,不能阻止技術上的new mysql()行為.

我們可以從技術上,用單例模式來解決

注:單例常用也常考,請認真練習

***/

echo '';

/* 第一步:乙個普通的類

這個普通類,可以new 來例項化

這顯然不是單例

class single

$s1 = new single();

$s2 = new single();

$s3 = new single();

*/ /*

第二步:看來new是罪惡之源,乾脆不讓new了

我們把構造方法 保護/私有

外部不能new了

--但引出乙個問題,不能new,那得不到物件,這不是單例,這是0例模式

class single

} $s1 = new single();

*/ /*

第三部,通過內部的static方法,來呼叫

class single

static public function getinstance()

} $s1 = single::getinstance();

$s2 = single::getinstance();

*/ /*

兩個物件什麼時間相等?

答:只有指向乙個物件位址的時候,才相等.

print_r($s1);

print_r($s2);

if($s1 === $s2) else

*/ /*

第四步,通過內部的static方法例項化,

並且,把例項儲存在類內部的靜態屬性上

*/ class single

static public function getinstance()

self::$ins = new self();

return self::$ins;

} } $s1 = single::getinstance();

$s2 = single::getinstance();

print_r($s1);

print_r($s2);

if($s1 === $s2) else

//**********=看問題***************//

class test extends single

} $t1 = new test();

$t2 = new test();

print_r($t1);

print_r($t2);

// 問題1:我們辛苦寫的單例,繼承一下就不靈了.

// 解決 final 最終的 詳見05.php

class s

static public function getinstance()

self::$ins = new self();

return self::$ins;

} } class t extends s

$t1 = t::getinstance();

$t2 = t::getinstance();

$t3 = clone $t2;

if($t1 === $t2) else

if($t3 === $t2) else

// clone又多出乙個物件, 試問,如何解決?

// 魔術方法很多, __construct, __destruct, __clone,__callstatic....

// 請同學們自行預習

?>

PHP物件導向 單例模式

單例模式 singleton pattern 單例模式 singleton pattern 是最簡單的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。這種模式涉及到乙個單一的類,該類負責建立自己的物件,同時確保只有單個物件被建立。這個類提供了一種訪問其唯一的物件的方式...

Php物件導向 單例模式

php物件導向 單例模式 保證類只有乙個例項 1.如何可以解決乙個類可以被無限地例項化?new,就能例項化一次,怎麼去限制,使用者不能無限次地new?將構造方法私有化。所有外部的new都操作失敗 class mysqldb private function construct 2.一旦構造方法私有化...

php物件導向開發之 單例模式

php的全域性變數給程式設計帶來了很大的靈活性,但全域性變數的不受約束性也帶來了很大的隱患。單例模式可以很好的替代全域性變數。假設有一朵花,每個人見到都會去澆花,然後再欣賞它。class flower public function look a new flower 將輸出 2013 01 08 ...