类Generator的对象无法转换为字符串

时间:2015-06-16 15:03:01

标签: php generator yield

我有一些可以返回大量数据的代码。因此,我没有将其保存到数组中,而是想使用生成器。但是,我遇到了很多问题。

现在,当我像这样简单地做这件事时

foreach ($this->test(0,10) as $test) {
    print $test;
}

public function test($from, $to) {
    for ($i = $from; $i < $to; $i++) {
        yield $i;
    }
}

我在这里得到以下输出

  

0123456789

现在,我想以现实生活中的例子来做同样的事情。喜欢这个

$posts = $this->getPosts();
foreach ($posts as $post) {
    print $post;
}

protected function getPosts()
{
    // Getting the content of the sitemap
    $response = Curl::get('http://wpde.org/sitemap.xml')[0];
    // Loading the string as XML
    $sitemapJson   = simplexml_load_string($response->getContent());
    // This case is true when the sitemap has a link to more sitemaps instead of linking directly to the posts
    if (isset($sitemapJson->sitemap)) {
        foreach ($sitemapJson->sitemap as $post) {
            if (substr($post->loc, -3) === "xml") {
                $this->setUrl((string)$post->loc);
                yield $this->getPosts(); // I also tried it here without the yield, but then I just get an empty output :/
            }
        }
    } 
    // This case is true, when the sitemap has now the direct links to the post
    elseif (isset($sitemapJson->url)) {
        foreach ($sitemapJson->url as $url) {
            yield (string)$url->loc;
        }
    }
}

但是我在这里得到错误:

  

捕获致命错误:类Generator的对象无法转换为字符串

奇怪的是,当我打印出网址时

print $this->url . '<br>';

我只获取Sitemap的第一个网址。但是,如果我删除了yield部分,我将获取Sitemap的所有链接。看起来它似乎不知何故停在那里?

无论如何,我只是无法打印出数据。我该怎么做?谢谢!

如果没有第一个案例中的收益,那么根本没有内容。

1 个答案:

答案 0 :(得分:3)

更改此行

yield $this->getPosts();

foreach($this->getPosts() as $post)
    yield $post;

仅作为一个项目,而不是整个&#34;集合&#34;可能会立刻咆哮。