【问题标题】:When I move code into a function, I get a Fatal error. How can I call code from function当我将代码移动到函数中时,出现致命错误。如何从函数调用代码
【发布时间】:2013-04-07 05:29:15
【问题描述】:

这段代码有两部分: 一种将文档添加到要搜索的索引中的功能,效果很好,而 crawl() 函数是一种获取页面内容的网络爬虫,效果也很好。

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

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

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

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

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

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

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

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

【问题讨论】:

    标签: php search-engine web-crawler


    【解决方案1】:

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

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

    【讨论】:

    • 非常感谢!我只需要将它作为函数的参数传递!谢谢你一万亿次,谢谢你!我一直难以理解范围......
    【解决方案2】:

    您已指定:

    // 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);
    

    【讨论】:

      猜你喜欢
      • 2019-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多