public function seek ( $position ) { if (!isset( $this - array [ $position ])) { throw new OutOfBoundsException ( "invalid seek position ( $position )" ); }
$this - position = $position ; }
public function rewind () { $this - position = 0 ; }
public function current () { return $this - array [ $this - position ]; }
public function key () { return $this - position ; }
public function next () { ++ $this - position ; }
public function valid () { return isset( $this - array [ $this - position ]); } }
try {
$it = new MySeekableIterator ; echo $it - current (), "/n" ;
$it - seek ( 2 ); echo $it - current (), "/n" ;
$it - seek ( 1 ); echo $it - current (), "/n" ;
$it - seek ( 10 );
} catch ( OutOfBoundsException $e ) { echo $e - getMessage (); } /* 结果: first element third element second element invalid seek position ( 10 ) */ SplObserver和SplSubject接口: SplObserver和SplSubject接口用来实现观察者设计模式,观察者设计模式是指当一个类的状态发生变化时,依赖它的对象都会收到通知并更新。使用场景非常广泛,比如说当一个事件发生后,需要更新多个逻辑操作,传统方式是在事件添加后编写逻辑,这种代码耦合并难以维护,观察者模式可实现低耦合的通知和更新机制。 看看SplObserver和SplSubject的接口结构: 复制代码 代码如下: //SplSubject结构 被观察的对象 interface SplSubject{ public function attach(SplObserver $observer); //添加观察者 public function detach(SplObserver $observer); //剔除观察者 public function notify(); //通知观察者 }
//SplObserver结构 代表观察者 interface SplObserver{ public function update(SplSubject $subject); //更新操作 } 看下面一个实现观察者的例子:复制代码 代码如下: class Subject implements SplSubject { private $observers = array();
public function attach(SplObserver $observer) { $this- observers[] = $observer; }
public function detach(SplObserver $observer) { if($index = array_search($observer, $this- observers, true)) { unset($this- observers[$index]); } }
public function notify() { foreach($this- observers as $observer) { $observer- update($this); } }
}
class Observer1 implements SplObserver { public function update(SplSubject $subject) { echo "逻辑1代码".PHP_EOL; } }
class Observer2 implements SplObserver { public function update(SplSubject $subject) { echo "逻辑2代码".PHP_EOL; } }
$subject = new Subject(); $subject- attach(new Observer1()); $subject- attach(new Observer2());