0

这段代码有两部分:一个将文档添加到要搜索的索引中,它工作正常,一个 crawl() 函数,它是一个获取页面内容的网络爬虫,它也工作正常。

但是,我需要从 crawl() 函数内部添加一个文档。

当我在 crawl() 函数中移动添加文档的代码时,我得到一个致命错误: 致命错误:调用非对象上的成员函数 addDocument()。

我想知道如何从 crawl 函数内部访问成员函数 addDocument() ?

现在,我有一个工作版本,其中 crawl() 函数以变量的形式返回它已抓取的内容,然后在 crawl() 函数之外的 addDocument 代码也可以访问返回的变量并将文档添加到索引就是这样。但是,只有在我抓取一个页面或没有链接的页面时,这才(逻辑上)有效。由于该函数仅在完成后才返回,并且由于它是递归跟踪页面链接的,因此它将返回的唯一内容是最后一页的内容。我需要将每个页面的内容添加为索引中的新文档。

这是上面描述的工作代码,尽可能多地评论:http: //pastebin.com/5ngcucDp

这是我尝试在 crawl() 函数中移动 addDocument() 的非工作代码:http: //pastebin.com/mUEwQJTG

如果您有涉及如何从 crawl() 函数内部访问 addDocument() 函数的解决方案,请分享。或者,如果您有一个涉及修改工作代码的解决方案,以便它返回它抓取的每个页面的内容而不是最后一页,请分享。

如果您有任何解决方案,请分享,因为我已经筋疲力尽并且已经尝试了我所知道的一切。

4

2 回答 2

1

将代码移动到函数时,您将完全删除它访问同一范围内的变量的能力。在这种情况下,您可能(不会查看您的场外代码)有类似的东西$someObject = new myClass();,然后尝试$someObject->addDocument()从函数内访问它。

您需要$someObject作为参数传递给函数,或者您可以在函数内部使用global $someObject,尽管这不是一个好主意。

于 2013-04-06T21:28:04.210 回答
0

您已指定:

// The below line is where the error takes place.
$elasticaType->addDocument($document);

是你的错误线。现在,PHP 正在尝试访问链接到的类$elasticaType如果您有链接的类,请使用:

$elasticaType = new ClassName();

如果没有,那么您应该创建一个类:

class Name {
   public function addDocument ($document){
         //Add document code 
         return $somevar;
    }
}

    $elasticaType = new Name();

$elasticaType->addDocument($document);
于 2013-04-06T21:29:15.880 回答