php mysql迭代器_PHP设计模式之迭代器模式(Iterator)代码实例大全(23)

目的

让对象变得可迭代并表现得像对象集合。

例子

在文件中的所有行(对象表示形式的)上逐行处理文件(也是对象)

PHP 标准库 (SPL) 定义了一个最适合此模式的接口迭代器!往往也需要实现 Countable 接口,允许在迭代器对象上使用 count($object) 方法。

UML图

87ac8eacebd7ad4f85c7168bddf5d285.png

代码

Book.php

namespace DesignPatterns\Behavioral\Iterator;

class Book

{

/**

* @var string

*/

private $author;

/**

* @var string

*/

private $title;

public function __construct(string $title, string $author)

{

$this->author = $author;

$this->title = $title;

}

public function getAuthor(): string

{

return $this->author;

}

public function getTitle(): string

{

return $this->title;

}

public function getAuthorAndTitle(): string

{

return $this->getTitle().' by '.$this->getAuthor();

}

}

BookList.php

namespace DesignPatterns\Behavioral\Iterator;

class BookList implements \Countable, \Iterator

{

/**

* @var Book[]

*/

private $books = [];

/**

* @var int

*/

private $currentIndex = 0;

public function addBook(Book $book)

{

$this->books[] = $book;

}

public function removeBook(Book $bookToRemove)

{

foreach ($this->books as $key => $book) {

if ($book->getAuthorAndTitle() === $bookToRemove->getAuthorAndTitle()) {

unset($this->books[$key]);

}

}

$this->books = array_values($this->books);

}

public function count(): int

{

return count($this->books);

}

public function current(): Book

{

return $this->books[$this->currentIndex];

}

public function key(): int

{

return $this->currentIndex;

}

public function next()

{

$this->currentIndex++;

}

public function rewind()

{

$this->currentIndex = 0;

}

public function valid(): bool

{

return isset($this->books[$this->currentIndex]);

}

}

测试

Tests/IteratorTest.php

namespace DesignPatterns\Behavioral\Iterator\Tests;

use DesignPatterns\Behavioral\Iterator\Book;

use DesignPatterns\Behavioral\Iterator\BookList;

use DesignPatterns\Behavioral\Iterator\BookListIterator;

use DesignPatterns\Behavioral\Iterator\BookListReverseIterator;

use PHPUnit\Framework\TestCase;

class IteratorTest extends TestCase

{

public function testCanIterateOverBookList()

{

$bookList = new BookList();

$bookList->addBook(new Book('Learning PHP Design Patterns', 'William Sanders'));

$bookList->addBook(new Book('Professional Php Design Patterns', 'Aaron Saray'));

$bookList->addBook(new Book('Clean Code', 'Robert C. Martin'));

$books = [];

foreach ($bookList as $book) {

$books[] = $book->getAuthorAndTitle();

}

$this->assertEquals(

[

'Learning PHP Design Patterns by William Sanders',

'Professional Php Design Patterns by Aaron Saray',

'Clean Code by Robert C. Martin',

],

$books

);

}

public function testCanIterateOverBookListAfterRemovingBook()

{

$book = new Book('Clean Code', 'Robert C. Martin');

$book2 = new Book('Professional Php Design Patterns', 'Aaron Saray');

$bookList = new BookList();

$bookList->addBook($book);

$bookList->addBook($book2);

$bookList->removeBook($book);

$books = [];

foreach ($bookList as $book) {

$books[] = $book->getAuthorAndTitle();

}

$this->assertEquals(

['Professional Php Design Patterns by Aaron Saray'],

$books

);

}

public function testCanAddBookToList()

{

$book = new Book('Clean Code', 'Robert C. Martin');

$bookList = new BookList();

$bookList->addBook($book);

$this->assertCount(1, $bookList);

}

public function testCanRemoveBookFromList()

{

$book = new Book('Clean Code', 'Robert C. Martin');

$bookList = new BookList();

$bookList->addBook($book);

$bookList->removeBook($book);

$this->assertCount(0, $bookList);

}

}

★如果喜欢我的文章,想与更多资深开发者一起交流学习的话,获取更多大厂面试相关技术咨询和指导,欢迎加入我们的群啊,暗号:phpzh(君羊号码856460874)。

259793f8a6a3df1d9d7c7bdc6c69478e.gif

内容不错的话希望大家支持鼓励下点个赞/喜欢,欢迎一起来交流;另外如果有什么问题 建议 想看的内容可以在评论提出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值