1

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!

+0

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

Répondre

0

Cela a été causé par un appel de fonction manquant un paramètre. Zoinks!

L'appel pertinent (après extraction urls et les correspondant à un modèle):

Avant:

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

Après:

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

Pouvez-vous s'il vous plaît partager le code pertinent? Cela peut aider d'autres utilisateurs. –

1

Je suppose que quelque part dans votre application, vous aurez quelque chose comme ceci:

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

Vous ne vérifiez jamais, si $crawler contient en fait un robot. Selon votre mise en œuvre de _returnCrawler(), il pourrait tout aussi bien être un false là-bas. Et si $crawlerType n'est pas défini sur "url", rien du tout ne sera renvoyé, car il n'y a pas de else avec une autre instruction return.

Alors, commencez par ajouter quelque chose comme ceci:

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

Maintenant, vous ne devriez pas avoir une erreur de PHP plus, mais votre propre message. De là, vous devriez être capable de comprendre pourquoi cela arrive et commencer à le réparer.

+0

Il s'est avéré être un oubli et une stupidité, mais je vais essayer d'utiliser "instanceOf". Merci! – Kyrre