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!
Goddamnit. Es war nur ein weiterer Aufruf dieser Funktion, der der Toggle-Parameter fehlte. Ich werde meine Lebensentscheidungen überdenken – Kyrre