1

URL 또는 HTML에서 문자열로 웹 크롤러를 반환하는 함수를 작성하고 있습니다. 나는 "토글 (toggle)"매개 변수를 제공함으로써 분리되어 동일한 기능을 사용할 수 있다고 생각했습니다. 이것이 나쁜 관행인지는 모르겠지만, 비슷한 문제로 스위치와 if/else를 사고없이 사용했습니다.PHP wrapping 비교 if/else 또는 스위치로 인해 오류가 발생합니다.

내 함수 호출 :

$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: 

AND (스위치 내부) 영향을 줄 :

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

그러나,이 기능은 저 I 원하는 결과를 얻을

나는 또한 스위치/케이스에 포장하려고 시도했는데, 이것은 나쁜 결과를 가져온다.

이 정말 내 머리 아파, 내가 사용

true로 평가하고 온 전성 검사를 인쇄
if($toggle === 'url'){...} 

는 또한

if(true){...} 

에서 어떤 다른 볼 수 없습니다

if(1 > 2){...} 

은이 함수의 데이터에 의존하는 함수에서 예상되는 급류를 제공하지 않습니다. 그들이 필요로하는 것을 말하기.

어떻게 될 수 있습니까? 논리 오류, 실명?

다른 기능이 없으면 다른 기능을 사용하여 해결할 수 있지만이 시점에서 나는 여기서 잘못 수행 한 것에 대해 진정으로 궁금합니다.

모든 도움말 또는 의견 (이 예에서는 무엇이든)을 크게 높이 평가합니다. $crawler 실제로 크롤러가 포함되어있는 경우,

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

당신은 확인하지 않음 :

+0

제기랄. 토글 매개 변수가 누락 된 것은이 함수에 대한 또 다른 호출이었습니다. 나는 내 삶의 선택을 재검토하러 갈거야 – 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

난 당신이 뭔가를해야합니다 응용 프로그램에서 그 곳을 가정합니다. _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