0

このコードには 2 つの部分があります。1 つは検索対象のインデックスにドキュメントを追加するもので、問題なく動作します。もう 1 つは、ページのコンテンツを取得する Web クローラーであり、これも問題なく動作します。

ただし、crawl() 関数内からドキュメントを追加する必要があります。

文書を追加するコードをcrawl()関数内に移動すると、Fatal Error: Fatal Error: call to member function addDocument() on a non-object. が発生します。

クロール関数内からメンバー関数 addDocument() にアクセスするにはどうすればよいですか?

現在、クロール()関数がクロールしたものを変数の形式で返す作業バージョンがあり、次に、クロール()関数の外側のaddDocumentコードも返された変数にアクセスし、ドキュメントをに追加しますインデックスはそのまま。しかし、それは (論理的に) 1 つのページまたはたどるリンクがないページをクロールしている場合にのみ機能します。この関数は完了時にのみ戻り、ページのリンクをたどるのは再帰的であるため、返される唯一のコンテンツは最後のページのコンテンツです。各ページのコンテンツを新しいドキュメントとしてインデックスに追加する必要がある場合。

上記の作業コードは次のとおりです

そして、addDocument()をcraw()関数内に移動しようとする非動作コードは次のとおりです: 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 に答える