From: Marcus Boerger Date: Thu, 15 Sep 2005 03:38:03 +0000 (+0000) Subject: - MFH: Add new files X-Git-Tag: php-5.1.0RC2~254 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a29501195f4d0fff6023ed53fc19bfb90d7a0151;p=php - MFH: Add new files --- diff --git a/ext/spl/examples/recursivearrayiterator.inc b/ext/spl/examples/recursivearrayiterator.inc new file mode 100755 index 0000000000..305e54cad9 --- /dev/null +++ b/ext/spl/examples/recursivearrayiterator.inc @@ -0,0 +1,55 @@ +current()); + } + + /** @return an iterator for the current elements children + * + * @note the returned iterator will be of the same class as $this + */ + function getChildren() + { + if (empty($this->ref)) + { + $this->ref = new ReflectionClass($this); + } + return $this->ref->newInstance($this->current()); + } + + private $ref; +} + +?> \ No newline at end of file diff --git a/ext/spl/internal/recursivefilteriterator.inc b/ext/spl/internal/recursivefilteriterator.inc new file mode 100755 index 0000000000..b651fb20ea --- /dev/null +++ b/ext/spl/internal/recursivefilteriterator.inc @@ -0,0 +1,62 @@ +getInnerIterator()->hasChildren(); + } + + /** @return an iterator for the current elements children + * + * @note the returned iterator will be of the same class as $this + */ + function getChildren() + { + if (empty($this->ref)) + { + $this->ref = new ReflectionClass($this); + } + return $this->ref->newInstance($this->getInnerIterator()->getChildren()); + } + + private $ref; +} + +?> \ No newline at end of file diff --git a/ext/spl/internal/splobjectstorage.inc b/ext/spl/internal/splobjectstorage.inc new file mode 100755 index 0000000000..56690f499b --- /dev/null +++ b/ext/spl/internal/splobjectstorage.inc @@ -0,0 +1,118 @@ +storage); + } + + /** @return whether iterator is valid + */ + function valid() + { + return key($this->storage) !== false; + } + + /** @return current key + */ + function key() + { + return $this->index; + } + + /** @return current object + */ + function current() + { + return current($this->storage); + } + + /** Forward to next element + */ + function next() + { + next($this->storage); + $this->index++; + } + + /** @return number of objects in storage + */ + function count() + { + return count($this->storage); + } + + /** @param obj object to look for + * @return whether $obj is contained in storage + */ + function contains($obj) + { + if (is_object($obj)) + { + foreach($this->storage as $object) + { + if ($object === $obj) + { + return true; + } + } + } + return false; + } + + /** @param $obj new object to attach to storage if not yet contained + */ + function attach($obj) + { + if (is_object($obj) && !$this->contains($obj)) + { + $this->storage[] = $obj; + } + } + + /** @param $obj object to remove from storage + */ + function detach($obj) + { + if (is_object($obj)) + { + foreach($this->storage as $idx => $object) + { + if ($object === $obj) + { + unset($this->storage[$idx]); + $this->rewind(); + return; + } + } + } + } +} + +?> \ No newline at end of file diff --git a/ext/spl/tests/observer_002.phpt b/ext/spl/tests/observer_002.phpt new file mode 100755 index 0000000000..5d006177f2 --- /dev/null +++ b/ext/spl/tests/observer_002.phpt @@ -0,0 +1,199 @@ +--TEST-- +SPL: SplObjectStorage +--FILE-- +getName() . ")\n"; + return parent::current(); + } + + function next() + { + echo __METHOD__ . "()\n"; + parent::next(); + } +} + +class ObserverImpl implements SplObserver +{ + protected $name = ''; + + function __construct($name = 'obj') + { + $this->name = '$' . $name; + } + + function update(SplSubject $subject) + { + echo $this->name . '->' . __METHOD__ . '(' . $subject->getName() . ");\n"; + } + + function getName() + { + return $this->name; + } +} + +class SubjectImpl implements SplSubject +{ + protected $name = ''; + protected $observers; + + function __construct($name = 'sub') + { + $this->observers = new MyObjectStorage; + $this->name = '$' . $name; + } + + function attach(SplObserver $observer) + { + echo $this->name . '->' . __METHOD__ . '(' . $observer->getName() . ");\n"; + $this->observers->attach($observer); + } + + function detach(SplObserver $observer) + { + echo $this->name . '->' . __METHOD__ . '(' . $observer->getName() . ");\n"; + $this->observers->detach($observer); + } + + function count() + { + return $this->observers->count(); + } + + function notify() + { + echo $this->name . '->' . __METHOD__ . "();\n"; + foreach($this->observers as $key => $observer) + { + $observer->update($this); + } + } + + function getName() + { + return $this->name; + } + + function contains($obj) + { + return $this->observers->contains($obj); + } +} + +$sub = new SubjectImpl; + +$ob1 = new ObserverImpl("ob1"); +$ob2 = new ObserverImpl("ob2"); +$ob3 = new ObserverImpl("ob3"); + +var_dump($sub->contains($ob1)); +$sub->attach($ob1); +var_dump($sub->contains($ob1)); +$sub->attach($ob1); +$sub->attach($ob2); +$sub->attach($ob3); +var_dump($sub->count()); + +$sub->notify(); + +$sub->detach($ob3); +var_dump($sub->count()); + +$sub->notify(); + +$sub->detach($ob2); +$sub->detach($ob1); +var_dump($sub->count()); + +$sub->notify(); + +$sub->attach($ob3); +var_dump($sub->count()); + +$sub->notify(); + +?> +===DONE=== + +--EXPECT-- +bool(false) +$sub->SubjectImpl::attach($ob1); +bool(true) +$sub->SubjectImpl::attach($ob1); +$sub->SubjectImpl::attach($ob2); +$sub->SubjectImpl::attach($ob3); +int(3) +$sub->SubjectImpl::notify(); +MyObjectStorage::rewind() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob1) +MyObjectStorage::key(0) +$ob1->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob2) +MyObjectStorage::key(1) +$ob2->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob3) +MyObjectStorage::key(2) +$ob3->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(0) +$sub->SubjectImpl::detach($ob3); +int(2) +$sub->SubjectImpl::notify(); +MyObjectStorage::rewind() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob1) +MyObjectStorage::key(0) +$ob1->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob2) +MyObjectStorage::key(1) +$ob2->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(0) +$sub->SubjectImpl::detach($ob2); +$sub->SubjectImpl::detach($ob1); +int(0) +$sub->SubjectImpl::notify(); +MyObjectStorage::rewind() +MyObjectStorage::valid(0) +$sub->SubjectImpl::attach($ob3); +int(1) +$sub->SubjectImpl::notify(); +MyObjectStorage::rewind() +MyObjectStorage::valid(1) +MyObjectStorage::current($ob3) +MyObjectStorage::key(0) +$ob3->ObserverImpl::update($sub); +MyObjectStorage::next() +MyObjectStorage::valid(0) +===DONE===