原理:
這一模式允許某個類觀察另一個類的狀態,當被觀察的類狀態發生改變的時候,觀察類可以收到通知並且做出相應的動作,通常情況下,一個觀察者類負責觀察被觀察者中的一個事件
使用場景:
用戶註冊(驗證郵件,用戶信息激活),購物網站下單時郵件/短信通知等.
接口:
SplSubject 接口,它代表着被觀察的對象,
其結構:
interface SplSubject
{
public function attach(SplObserver $observer);
public function detach(SplObserver $observer);
public function notify();
}
SplObserver 接口,它代表着充當觀察者的對象,
其結構:
interface SplObserver
{
public function update(SplSubject $subject);
}
<?php
class User implements SplSubject
{
var $uername='';
var $userid;
var $useremail;
const REGISTER=1;//註冊
const RECHARGE=2;//用戶充值
/*此處的作用是
*註冊觀察者,此數組存放觀察者,不同的事件根據type去調用不同的觀察者
*/
public $observers = array();
//添加觀察者
public function attach(SplObserver $observer, $type)
{
$this->observers[$type] = $observer;
}
//註銷觀察者
public function detach(SplObserver $observer, $type)
{
if(array_search($observer, $this->observers[$type]))
{
unset($this->observers[$type]);
}
}
/*此處的作用是
*負責發送消息給觀察者
*/
public function notify($type)
{
if(!empty($this->observers[$type]))
{
foreach($this->observers[$type] as $observer)
{
$observer->update($this);
}
}
}
public function addUser($username='',$userid='',$useremail='')
{
//執行sql
$this->username=$username;
//數據庫插入成功
$res = true;
//調用通知觀察者
$this->notify(self::REGISTER);
return $res;
}
public function charge()
{
//執行sql
//數據庫更新成功
$res = true;
//調用通知觀察者
$this->notify(self::RECHARGE);
return $res;
}
}
class SendMail implements SplObserver
{
public function update(SplSubject $subject)
{
echo $subject->username;
// $content="歡迎您註冊".$username;
// $this->sendMail($content);
}
public function sendMail($email, $title, $content)
{
//調用郵件接口,發送郵件
}
}
$mail=new SendMail();
$user=new User();
$user->attach($mail,1);
$user->addUser("mtg",1);
$user->notify();