1

Ich schreibe eine Funktion für die Rückgabe eines Webcrawler, entweder von einer URL oder von HTML als String. Ich dachte, ich könnte die gleiche Funktion verwenden, aufgeteilt durch einen "Toggle" -Parameter. Ich weiß nicht, ob das eine schlechte Übung ist, aber ich habe Switch und If/Else in einer ähnlichen Angelegenheit vorher ohne Zwischenfall benutzt.PHP Wrapping im Vergleich if/else oder Schalter verursacht Fehler

Hier wird der problematische Code ist:

Meine Funktionsaufruf:

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

Und die Funktion (Plausibilitätsprüfung enthalten):

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; 
     } 
    } 
} 

Wie es aussieht, macht dies eine andere Funktion Freak später im Programm (Funktion mit foreach auf HTML-Elemente zum Abrufen von Text usw.).

Der Fehler/Ausgabe:

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: 

Und die betroffene Leitung (innerhalb eines Schalters):

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

Jedoch gibt diese Funktion mir das Ergebnis ich will:

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; 
     } 
    } 
} 

Ich habe auch versucht, es in einen Switch/Case zu wickeln, der das gleiche schlechte Ergebnis liefert.

Das tut wirklich weh mein Gehirn, und ich kann nicht sehen, wie

if($toggle === 'url'){...} 

, die den Wert true und druckt die Plausibilitätsprüfung von

if(true){...} 

auch anders ist, mit

if(1 > 2){...} 

gibt die erwartete Flut von Fehlern von Funktionen abhängig von den Daten von dieser Funktion nicht erhalten was sie brauchen.

Was könnte das verursachen? Logikfehler, Blindheit?

Wenn nichts anderes, könnte dies durch verschiedene Funktionen gelöst werden, aber an dieser Stelle bin ich wirklich neugierig, was ich hier falsch gemacht habe.

Jede Hilfe oder Rückmeldung (zu irgendetwas in diesen Beispielen) wird sehr geschätzt!

+0

Goddamnit. Es war nur ein weiterer Aufruf dieser Funktion, der der Toggle-Parameter fehlte. Ich werde meine Lebensentscheidungen überdenken – Kyrre

Antwort

0

Es wurde durch einen Funktionsaufruf verursacht, der einen Parameter fehlte. Zoinks!

die jeweilige Aufforderung (nach URLs und passenden, sie zu einem Muster zu extrahieren):

Bevor:

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

After:

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

Können Sie bitte den relevanten Code teilen? Es kann einigen anderen Benutzern helfen. –

1

Ich gehe davon aus, dass irgendwo in der Anwendung, die Sie so etwas wie dieses haben:

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

Sie nie überprüfen, ob $crawler tatsächlich einen Crawler enthält. Entsprechend Ihrer Implementierung von _returnCrawler() könnte dort auch ein false drin sein. Und wenn $crawlerType nicht auf "url" eingestellt ist, wird überhaupt nichts zurückgegeben, weil dort keine else mit einer alternativen return Aussage enthalten ist.

Also, starten Sie so etwas wie dies mit dem Hinzufügen:

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

Nun sollten Sie nicht ein PHP-Fehler mehr, aber Ihre eigene Nachricht. Von dort sollten Sie in der Lage sein herauszufinden, warum dies passiert und beginnen, es zu beheben.

+0

Es stellte sich heraus, dass es ein Versehen und eine Dummheit war, aber ich werde versuchen, "instanceOf" zu verwenden. Vielen Dank! – Kyrre