**:燕十八
<?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 ...