2013-04-06 26 views
0
調用代碼

該代碼有兩部分: 向要搜索的索引添加文檔的工作正常,以及一個抓取()函數,該函數是一個抓取Web頁面的獲取一個頁面,這也很好。當我將代碼移入某個函數時,出現致命錯誤。如何從函數

但是,我需要從crawl()函數內部添加一個文檔。

當我移動,增加了爬網()函數內部文件的代碼,我得到一個致命錯誤: 致命錯誤:調用一個非對象的成員函數addDocument()。

我想知道如何從爬行函數內部訪問成員函數addDocument()?

現在,我有一個工作版本,其中crawl()函數返回它以變量形式爬行的內容,然後在crawl()函數之外的addDocument代碼也可以訪問返回的變量,以這種方式將文檔添加到索引。 但是,只有(邏輯上)在我抓取一個頁面或一個沒有鏈接的頁面時才起作用。由於該函數只在完成時才返回,並且由於它是遞歸的以遵循頁面的鏈接,所以它將返回的唯一內容是最後一頁的內容。 我需要將每個頁面的內容添加爲索引中的新文檔。

這裏是工作的代碼,如上所述,評論,就像我可以:http://pastebin.com/5ngcucDp

,並在這裏是不工作的代碼,我嘗試移動addDocument()爬行()函數中:http://pastebin.com/mUEwQJTG

如果您有涉及如何從crawl()函數內部訪問addDocument()函數的解決方案,請分享。 或者,如果您有涉及修改工作代碼的解決方案,以便返回其爬網的每個頁面的內容而不是最後一頁,請分享。

如果您有任何解決方案,請分享,因爲我絕對精疲力盡,並嘗試瞭解我所知道的一切。

回答

1

將代碼移到函數中時,您完全刪除了訪問同一範圍內變量的能力。在這種情況下,你可能(不會去查看你的場外代碼)有類似於$someObject = new myClass();的東西,然後試圖從該函數內部訪問$someObject->addDocument()

您需要通過$someObject作爲參數傳遞給函數,或者你可以使用global $someObject函數內部,雖然它不是好主意。

+0

非常感謝您!我只是將它作爲函數的參數傳遞!謝謝你一萬億次,謝謝!我一直無法理解範圍...... – IMUXIxD 2013-04-06 23:27:09

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); 
相關問題