事件机制常用到
相关问题https://www.oschina.net/question/2243420_2237246
<?php
abstract class SubjectAbstract implements SplSubject
{
protected $status = '';
abstract public function getStatus();
abstract public function setStatus($status);
}
class Subject extends SubjectAbstract
{
protected $status = '';
protected $observers=[];
public function __construct($status='on')
{
$this->status = $status;
}
public function getStatus()
{
return $this->status;
}
public function setStatus($status)
{
return $this->status = $status;
}
public function attach(SplObserver $observer){
$this->observers[]=$observer;
}
public function detach(SplObserver $observer){
foreach($this->observers as $key=>$val){
if($val === $observer){
unset($this->observers[$key]);
}
}
}
public function notify(){
foreach($this->observers as $key=>$observer){
$observer->update($this);
}
}
}
class AObserver implements SplObserver
{
public function update(SplSubject $subject)
{
echo __class__.'获取到主题状态改变成:'.$subject->getStatus()."\n";
}
}
class BObserver implements SplObserver
{
public function update(SplSubject $subject)
{
echo __class__.'获取到主题状态改变成:'.$subject->getStatus()."\n";
}
}
class CObserver implements SplObserver
{
public function update(SplSubject $subject)
{
echo __class__.'获取到主题状态改变成:'.$subject->getStatus()."\n";
}
}
var_dump(new AObserver instanceof SplSubject);
$subject = new Subject('on');
$subject->attach(new AObserver);
$subject->attach(new BObserver);
$c = new CObserver;
$subject->attach($c);
//$subject->detach($c);
$subject->setStatus('off');
$subject->notify();