当我将代码移动到函数中时,我收到致命错误。如何从函数中调用代码

时间:2013-04-06 21:25:04

标签: php search-engine web-crawler

此代码有两部分: 一个将文档添加到要搜索的索引,哪个工作正常,以及一个crawl()函数,它是一个获取页面内容的Web爬虫,也可以正常工作。

但是,我需要在crawl()函数中添加一个文档。

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

我想知道如何从抓取功能中访问成员函数addDocument()?

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

以上是上述工作代码,我尽可能多地发表评论:http://pastebin.com/5ngcucDp

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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);