首页 文章

在比较if / else或switch中的PHP包装会导致错误

提问于
浏览
1

我正在编写一个函数,用于从URL或HTML作为字符串返回webcrawler . 我以为我可以使用相同的功能,通过提供“toggle”参数进行拆分 . 我不知道这是不是很糟糕的做法,但我之前使用过switch和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;
        }
    }
}

就目前而言,这使得另一个函数在程序的后期出现了问题(使用foreach获取HTML文本的函数等等) .

错误/输出:

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:

受影响的线(在开关内):

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

但是,这个函数给了我想要的结果:

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

我还试图将它包装在Switch / Case中,这会产生同样糟糕的结果 .

这真的伤害了我的大脑,我看不出怎么样

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

评估为true并打印完整性检查的任何不同

if(true){...}

另外,使用

if(1 > 2){...}

从依赖于此函数的数据的函数中提供预期的错误来源,而不是得到他们需要的东西 .

什么可能导致这个?逻辑错误,失明?

如果不出意外,这可以通过制作不同的功能来解决,但在这一点上,我真的很好奇我在这里做错了什么 .

任何帮助或反馈(在这些例子中的任何内容)非常感谢!

2 回答

  • 1

    它是由函数调用缺少参数引起的 . 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

    我假设你的应用程序中的某个地方你会有这样的东西:

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

    如果 $crawler 实际上包含一个Crawler,你永远不会检查 . 根据你对 _returnCrawler() 的实现,那里也可能有一个 false . 如果 $crawlerType 未设置为"url",则不会返回任何内容,因为其中没有 else ,并且有另一个 return 语句 .

    所以,首先添加这样的东西:

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

    现在你不应再得到一个PHP错误,而是你自己的消息 . 从那里你应该能够弄清楚为什么会发生这种情况并开始修复它 .

相关问题