J'écris une fonction pour renvoyer un webcrawler, soit à partir d'une URL ou de HTML en tant que chaîne. Je pensais pouvoir utiliser la même fonction, divisée en fournissant un paramètre "bascule". Je ne sais pas si c'est une mauvaise pratique, mais j'ai utilisé switch et if/else dans une affaire similaire avant sans incident.L'habillage de PHP dans le comparatif if/else ou switch provoque une erreur
Voici le code problématique:
Mon appel de fonction:
$mainCrawler = $this->_returnCrawler($url, $urlPattern, 'url');
et la fonction (contrôle de santé mentale inclus):
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;
}
}
}
En l'état actuel, ce qui rend un autre monstre de fonction out plus tard dans le programme (fonction avec foreach sur les éléments HTML pour obtenir du texte, etc).
L'erreur/sortie:
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:
Et la ligne affectée (à l'intérieur d'un commutateur):
$crawler->filter($tag)->each(function ($node) use (&$tagContent, &$n, &$tag) {
$tagContent[$tag][$n] = trim($node->text());
$n++;
});
Cependant, cette fonction me donne le résultat que je veux:
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;
}
}
}
J'ai aussi essayé de l'emballer dans un Switch/Case, ce qui donne le même mauvais résultat.
Ce fait vraiment mal mon cerveau, et je ne vois pas comment
if($toggle === 'url'){...}
qui évalue true et imprime le contrôle de la santé mentale est différent de
if(true){...}
Aussi, en utilisant
if(1 > 2){...}
donne le torrent attendu d'erreurs de fonctions dépendant des données de cette fonction pas get ting ce dont ils ont besoin.
Ce qui pourrait causer cela? Erreur logique, cécité?
Si rien d'autre, cela pourrait être résolu en faisant des fonctions différentes, mais à ce stade, je suis vraiment curieux de savoir ce que j'ai fait mal ici.
Toute aide ou rétroaction (sur quoi que ce soit dans ces exemples) est grandement appréciée!
Goddamnit. C'était juste un autre appel à cette fonction qui manquait le paramètre toggle. Je vais aller reconsidérer mes choix de vie – Kyrre