1

WebcrawlerをURLまたはHTMLから文字列として返す関数を作成しています。私は同じ機能を使い、 "トグル"パラメータを提供することで分割できると考えていました。私はこれが悪い習慣であるかどうかはわかりませんが、スイッチとif/elseを似たような事柄で事故なく使用しました。ここでPHPラッピング比較if/elseまたはswitchによってエラーが発生する

は、問題のあるコードです:

私の関数呼び出し:

$mainCrawler = $this->_returnCrawler($url, $urlPattern, 'url'); 

と機能(健全性チェックが含まれています):現状では

public function _returnCrawler($target='', $urlPattern='', $toggle='') 
{ 
    if($toggle === 'url'){echo "indeed it is";} //Works as expected 
    if($toggle === 'url'){ //things break down the line 
      if(preg_match($urlPattern, $target)){ 
       $client = new Client(); 
       $client->getClient()->setDefaultOption('config/curl/'.CURLOPT_TIMEOUT, 60); 
       return $crawler = $client->request('GET', $target); 
      }else{ 
       return false; 
     } 
    } 
} 

、これは別の関数フリークになりますプログラムの後半で(HTML要素のforeachを使ってテキストを取得するなどの機能)。

エラー/出力:

indeed it is 
Fatal error: Call to a member function filter() on a non-object in /www/otherway/application/controllers/Welcome.php on line 267 
A PHP Error was encountered 

Severity: Error 

Message: Call to a member function filter() on a non-object 

Filename: controllers/Welcome.php 

Line Number: 267 

Backtrace: 

と(スイッチ内部の)影響を受ける行:

public function _returnCrawler($target='', $urlPattern='', $toggle='') 
{ 
    if($toggle === 'url'){echo "indeed it is";} 
    if(true){ //Difference is here 
      if(preg_match($urlPattern, $target)){ 
       $client = new Client(); 
       $client->getClient()->setDefaultOption('config/curl/'.CURLOPT_TIMEOUT, 60); 
       return $crawler = $client->request('GET', $target); 
      }else{ 
       return false; 
     } 
    } 
} 

$crawler->filter($tag)->each(function ($node) use (&$tagContent, &$n, &$tag) { 
           $tagContent[$tag][$n] = trim($node->text()); 
           $n++; 
          }); 

ただし、この機能は私が望む結果を与えます

私はスイッチ/ケースでそれをラップしようとしましたが、これは同じ悪い結果をもたらします。

は、これは本当に私の脳が痛い、と私は使用して、

trueに評価され、健全性チェックを印刷し
if($toggle === 'url'){...} 

はまた

if(true){...} 

から何が違うのですかを確認することはできません

if(1 > 2){...} 

は、この関数のデータに依存する関数から予想されるトレントを得ることはできません彼らが必要とするものを訴える。

この原因は何ですか?論理エラー、失明?

これ以外の場合は、これは別の機能を使用することで解決できますが、ここでは私が間違って行ったことについて本当に興味があります。

これらの例のヘルプやフィードバックは大変ありがとうございます。

+0

Goddamnit。これは、この関数のもう一つの呼び出しで、トグルパラメータが欠落していました。私は私の人生の選択を再考するつもりだ – Kyrre

答えて

0

パラメータの欠落した関数呼び出しが原因でした。 Zoinks!

関連コール(URLを抽出し、パターンにそれらをマッチング後):

前:

if(isset($matchUrl)){ 
      //about, contact, skateboards, etc... 
      foreach ($matchUrl as $match => $link) { 
       if(preg_match($urlPattern, $link)){ 
        $matchCrawler[$match] = $this->_returnCrawler($link, $urlPattern); 

後:

if(isset($matchUrl)){ 
      //about, contact, skateboards, etc... 
      foreach ($matchUrl as $match => $link) { 
       if(preg_match($urlPattern, $link)){ 
        $matchCrawler[$match] = $this->_returnCrawler($link, $urlPattern, 'url'); 
+0

関連コードを教えていただけますか?他のユーザーに役立つかもしれません。 –

1

私はどこかのアプリケーションでは、あなたがこのようなものがありますと仮定します。$crawlerが実際にクローラが含まれている場合、あなたがチェックしたことがない

foreach ($urls as $url) { 
    $crawler = $this->_returnCrawler($url, $urlPattern, $crawlerType); 
    $crawler->filter($tag)->each(/* ... */); 
} 

を。 _returnCrawler()の実装によれば、そこには同様にfalseが存在する可能性があります。 $crawlerTypeが "url"に設定されていない場合は、代替return文ではelseが存在しないため、何も返されません。

if ($crawler instanceof Client) { 
    $crawler->filter($tag)->each(/* ... */); 
} else { 
    echo "Woops. Didn't get a crawler client."; 
} 

今、あなたはもうPHPのエラーを取得しますが、独自のメッセージではないはずです。

ので、このようなものを追加することで始まります。そこから、なぜこのようなことが起きているのかを突き止めることができます。

+0

それは監視と愚かさに判明しましたが、私は "instanceOf"を使用しようとします。ありがとう! – Kyrre

関連する問題