SplSubject SplObserver SplObjectStorage使用方法

SplSubject 接口

SplSubject 接口与 SplObserver 接口一起使用实现「 观察者模式 」

接口

SplSubject {
/* 方法 */
// 添加一个 SplObserver 对象
abstract public void attach ( SplObserver $observer )
// 删除一个 SplObserver 对象
abstract public void detach ( SplObserver $observer )
// 通知观察者
abstract public void notify ( void )
}
SplObserver 接口
SplObserver {
/* 方法 */
//接收来自 subject 的更新
abstract public void update ( SplSubject $subject )
}

示例代码

/**
* Subject,that who makes news
*/
class Newspaper implements \SplSubject{
    private $name;
    private $observers = array();
    private $content;

    public function __construct($name) {
        $this->name = $name;
    }

    //add observer
    public function attach(\SplObserver $observer) {
        $this->observers[] = $observer;
    }

    //remove observer
    public function detach(\SplObserver $observer) {

        $key = array_search($observer,$this->observers, true);
        if($key){
            unset($this->observers[$key]);
        }
    }

    //set breakouts news
    public function breakOutNews($content) {
        $this->content = $content;
        $this->notify();
    }

    public function getContent() {
        return $this->content." ({$this->name})";
    }

    //notify observers(or some of them)
    public function notify() {
        foreach ($this->observers as $value) {
            $value->update($this);
        }
    }
}

/**
* Observer,that who recieves news
*/
class Reader implements SplObserver{
    private $name;

    public function __construct($name) {
        $this->name = $name;
    }

    public function update(\SplSubject $subject) {
        echo $this->name.' is reading breakout news <b>'.$subject->getContent().'</b><br>';
    }
}

$newspaper = new Newspaper('Newyork Times');

$allen = new Reader('Allen');
$jim = new Reader('Jim');
$linda = new Reader('Linda');

//add reader
$newspaper->attach($allen);
$newspaper->attach($jim);
$newspaper->attach($linda);

//remove reader
$newspaper->detach($linda);

//set break outs
$newspaper->breakOutNews('USA break down!');

//=====output======
//Allen is reading breakout news USA break down! (Newyork Times)
//Jim is reading breakout news USA break down! (Newyork Times)
SplObjectStorage 类
SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess {
/* 方法 */
public void addAll ( SplObjectStorage $storage ) //将其他 SplObjectStorage 对象所包含的对象添加到当前对象中。
public void attach ( object $object [, mixed $data = NULL ] ) //添加一个对象。
public bool contains ( object $object ) //判断当前storage中是否存在一个指定的对象。
public int count ( void ) //返回当前 storage 对象中对象个数。
public object current ( void )//返回当前对象实例。
public void detach ( object $object )//删除指定对象。
public string getHash ( object $object )//为包含对象计算唯一标识符。
public mixed getInfo ( void )//返回与当前迭代器条目关联的数据。
public int key ( void )//返回当前迭代器索引。
public void next ( void )//向前移动到下一个元素
public bool offsetExists ( object $object )//检测指定对象是否存在 storage 中。
public mixed offsetGet ( object $object )//返回与对象关联的数据。
public void offsetSet ( object $object [, mixed $data = NULL ] )//将数据关联到存储中的对象。
public void offsetUnset ( object $object )//从 storage 中移除一个对象。
public void removeAll ( SplObjectStorage $storage )//从当前存储中移除另一个存储中包含的对象。
public void removeAllExcept ( SplObjectStorage $storage )//从当前存储中移除包含在另一个存储中的对象以外的所有对象。
public void rewind ( void )//返回到迭代器的第一个元素
public string serialize ( void )//序列化 storage。
public void setInfo ( mixed $data )//设置与当前迭代器条目关联的数据。
public void unserialize ( string $serialized )//将存储从其字符串表示形式取消序列化。
public bool valid ( void )//检查当前位置是否有效
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值