1--TEST-- 2SPL: SplObserver and SplSubject (empty notify) 3--FILE-- 4<?php 5 6class ObserverImpl implements SplObserver 7{ 8 protected $name = ''; 9 10 function __construct($name = 'obj') 11 { 12 $this->name = '$' . $name; 13 } 14 15 function update(SplSubject $subject) 16 { 17 echo $this->name . '->' . __METHOD__ . '(' . $subject->getName() . ");\n"; 18 } 19 20 function getName() 21 { 22 return $this->name; 23 } 24} 25 26class SubjectImpl implements SplSubject 27{ 28 protected $name = ''; 29 protected $observers = array(); 30 31 function __construct($name = 'sub') 32 { 33 $this->name = '$' . $name; 34 } 35 36 function attach(SplObserver $observer) 37 { 38 echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n"; 39 if (!in_array($observer, $this->observers)) 40 { 41 $this->observers[] = $observer; 42 } 43 } 44 45 function detach(SplObserver $observer) 46 { 47 echo '$sub->' . __METHOD__ . '(' . $observer->getName() . ");\n"; 48 $idx = array_search($observer, $this->observers); 49 if ($idx !== false) 50 { 51 unset($this->observers[$idx]); 52 } 53 } 54 55 function notify() 56 { 57 echo '$sub->' . __METHOD__ . "();\n"; 58 foreach($this->observers as $observer) 59 { 60 $observer->update($this); 61 } 62 } 63 64 function getName() 65 { 66 return $this->name; 67 } 68} 69 70$sub = new SubjectImpl; 71 72$ob1 = new ObserverImpl("ob1"); 73$ob2 = new ObserverImpl("ob2"); 74$ob3 = new ObserverImpl("ob3"); 75 76$sub->attach($ob1); 77$sub->attach($ob1); 78$sub->attach($ob2); 79$sub->attach($ob3); 80 81$sub->notify(); 82 83$sub->detach($ob3); 84 85$sub->notify(); 86 87$sub->detach($ob2); 88$sub->detach($ob1); 89 90$sub->notify(); 91 92$sub->attach($ob3); 93 94$sub->notify(); 95?> 96--EXPECT-- 97$sub->SubjectImpl::attach($ob1); 98$sub->SubjectImpl::attach($ob1); 99$sub->SubjectImpl::attach($ob2); 100$sub->SubjectImpl::attach($ob3); 101$sub->SubjectImpl::notify(); 102$ob1->ObserverImpl::update($sub); 103$ob2->ObserverImpl::update($sub); 104$ob3->ObserverImpl::update($sub); 105$sub->SubjectImpl::detach($ob3); 106$sub->SubjectImpl::notify(); 107$ob1->ObserverImpl::update($sub); 108$ob2->ObserverImpl::update($sub); 109$sub->SubjectImpl::detach($ob2); 110$sub->SubjectImpl::detach($ob1); 111$sub->SubjectImpl::notify(); 112$sub->SubjectImpl::attach($ob3); 113$sub->SubjectImpl::notify(); 114$ob3->ObserverImpl::update($sub); 115