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 )//检查当前位置是否有效
}

猜你喜欢

转载自blog.csdn.net/zp_00000/article/details/81086752