Итерация по результатам базы данных с интерфейсом итератора php

Я изучал эту книгу по php, и есть этот пример шаблона итератора, который использует интерфейс итератора. Я могу использовать интерфейс итератора для перебора простых массивов, но я не совсем понимаю пример, показанный в книге. Выкладываю фрагменты кода. Он говорит вместо того, чтобы делать что-то подобное.

<?php
$posts = getAllPosts(); //example function return all post ids of this author
for($i = 0; $i<count($posts); $i++) 
{
$title = getPostTitle($post[$i]);
echo $title;
$author = getPostAuthor($post[$i]);
$content = parseBBCode(getPostContent($post[$i]));
echo "Content";
$comments = getAllComments($post[$i]);
for ($j=0; $j<count($comments); $j++)
{
$commentAuthor = getCommentAuthor($comments[$j]);
echo $commentAuthor;
$comment = getCommentContent($comments[$j]);
echo $comment;
}
}
?>

Мы можем реализовать интерфейс итератора, чтобы обеспечить что-то более эффективное.

<?php
class Posts implements Iterator
{
private $posts = array();
public function __construct($posts)
{
if (is_array($posts)) {
$this->posts = $posts;
}
}
public function rewind() {
reset($this->posts);
}
public function current() {
return current($this->posts);
}
public function key() {
return key($this->var);
}
public function next() {
return next($this->var);
}
public function valid() {
return ($this->current() !== false);
}
}
?>

«Теперь давайте воспользуемся только что созданным Iterator».

<?
$blogposts = getAllPosts();
$posts = new Posts($posts);
foreach ($posts as $post)
{
echo $post->getTitle();
echo $post->getAuthor();
echo $post->getDate();
echo $post->getContent();
$comments = new Comments($post->getComments());
//another Iterator for comments, code is same as Posts
foreach ($comments as $comment)
{
echo $comment->getAuthor();
echo $comment->getContent();
}
}
?>

Теперь я не понимаю, почему $blogposts никогда не использовался, почему он не является частью методов какого-либо класса и какие данные он будет возвращать, массив или объект.

Я также не понимаю, как достигается $post->getTitle(). Я бы понял $post['title'] или $posts->getTitle(), так как мы можем добавить метод getTitle() в класс Posts.

Я бы очень хотел воспроизвести что-то подобное на чем-то, над чем я работаю.

делает

foreach($key as $value) {
    $value->getTitle();
}

вместо

foreach($key as $value) {
    $value['title'];
    //or
    $key->getTitle()
}

person Youngestdj    schedule 09.07.2017    source источник


Ответы (1)


Кажется, опечатка, я думаю, что это должно быть

$blogposts = getAllPosts();
$posts = new Posts($blogposts);

Что касается доступа к методу getTitle, мне нужно больше кода, чтобы правильно ответить на вопрос... Но я буду работать, если функция "getAllPosts" возвращает массив объектов Post, которые реализуют метод "getTitle()"

Надеюсь, поможет!

person darode    schedule 09.07.2017
comment
дать согласие. $this-›var тоже кажется опечаткой. Может быть, получить лучшую книгу. - person jh1711; 09.07.2017
comment
Возврат массива почтовых объектов звучит так, будто вам придется много раз запрашивать базу данных. - person Youngestdj; 09.07.2017
comment
Есть ли способ заставить getAllPosts() возвращать массив объектов Post, запрашивая базу данных только один раз? - person Youngestdj; 10.07.2017
comment
Сейчас я иду по похожей кроличьей норе. - person Hans; 05.11.2018