diff --git a/Behavioral/Iterator/BookList.php b/Behavioral/Iterator/BookList.php index 6fcf265..9c0b9d4 100644 --- a/Behavioral/Iterator/BookList.php +++ b/Behavioral/Iterator/BookList.php @@ -9,7 +9,7 @@ class BookList implements \Countable public function getBook($bookNumberToGet) { - if ((int)$bookNumberToGet <= $this->count()) { + if (isset($this->books[$bookNumberToGet])) { return $this->books[$bookNumberToGet]; } diff --git a/Behavioral/Iterator/BookListIterator.php b/Behavioral/Iterator/BookListIterator.php index bc15ffb..93df6d7 100644 --- a/Behavioral/Iterator/BookListIterator.php +++ b/Behavioral/Iterator/BookListIterator.php @@ -8,7 +8,7 @@ class BookListIterator implements \Iterator /** * @var BookList */ - protected $bookList; + private $bookList; /** * @var int @@ -61,7 +61,7 @@ class BookListIterator implements \Iterator */ public function valid() { - return $this->currentBook < $this->bookList->count(); + return null !== $this->bookList->getBook($this->currentBook); } /** diff --git a/Behavioral/Iterator/BookListReverseIterator.php b/Behavioral/Iterator/BookListReverseIterator.php index 973bd0b..d7ec49a 100644 --- a/Behavioral/Iterator/BookListReverseIterator.php +++ b/Behavioral/Iterator/BookListReverseIterator.php @@ -2,22 +2,77 @@ namespace DesignPatterns\Behavioral\Iterator; -class BookListReverseIterator extends BookListIterator +class BookListReverseIterator implements \Iterator { + /** + * @var BookList + */ + private $bookList; + + /** + * @var int + */ + protected $currentBook = 0; + public function __construct(BookList $bookList) { $this->bookList = $bookList; $this->currentBook = $this->bookList->count() - 1; } + /** + * Return the current book + * @link http://php.net/manual/en/iterator.current.php + * @return Book Can return any type. + */ + public function current() + { + return $this->bookList->getBook($this->currentBook); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Move forward to next element + * @link http://php.net/manual/en/iterator.next.php + * @return void Any returned value is ignored. + */ public function next() { $this->currentBook--; } + /** + * (PHP 5 >= 5.0.0)
+ * Return the key of the current element + * @link http://php.net/manual/en/iterator.key.php + * @return mixed scalar on success, or null on failure. + */ + public function key() + { + return $this->currentBook; + } + + /** + * (PHP 5 >= 5.0.0)
+ * Checks if current position is valid + * @link http://php.net/manual/en/iterator.valid.php + * @return boolean The return value will be casted to boolean and then evaluated. + * Returns true on success or false on failure. + */ public function valid() { - return 0 <= $this->currentBook; + return null !== $this->bookList->getBook($this->currentBook); + } + + /** + * (PHP 5 >= 5.0.0)
+ * Rewind the Iterator to the first element + * @link http://php.net/manual/en/iterator.rewind.php + * @return void Any returned value is ignored. + */ + public function rewind() + { + $this->currentBook = $this->bookList->count() - 1; } }