PHP 换行比较 if/else 或 switch 导致错误

PHP wrapping in comparative if/else or switch causes error

我正在编写一个函数,用于从 URL 或 HTML 作为字符串返回网络爬虫。我在想我可以使用相同的功能,通过提供 "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;
        }
    }
}

就目前而言,这使得程序稍后的另一个函数变得异常(在 HTML 元素上使用 foreach 获取文本等的函数)。

error/output:

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'){...}

计算结果为真并打印完整性检查与

有任何不同
if(true){...}

另外,使用

if(1 > 2){...}

给出函数的预期错误洪流,这些错误依赖于来自此函数的数据没有得到他们需要的。

这可能是什么原因造成的?逻辑错误,失明?

如果没有别的,这可以通过制作不同的功能来解决,但此时我真的很好奇我在这里做错了什么。

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

我假设您的应用程序中的某处会有类似这样的内容:

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

您永远不会检查 $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 错误,而是您自己的消息。从那里您应该能够找出发生这种情况的原因并开始修复它。

这是由于缺少参数的函数调用引起的。 Zoinks!

相关调用(提取网址并将其与模式匹配后):

之前:

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');