我正在编写一个函数,用于从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 回答
它是由函数调用缺少参数引起的 . Zoinks!
相关调用(在提取URL并将它们与模式匹配之后):
之前:
后:
我假设你的应用程序中的某个地方你会有这样的东西:
如果
$crawler
实际上包含一个Crawler,你永远不会检查 . 根据你对_returnCrawler()
的实现,那里也可能有一个false
. 如果$crawlerType
未设置为"url",则不会返回任何内容,因为其中没有else
,并且有另一个return
语句 .所以,首先添加这样的东西:
现在你不应再得到一个PHP错误,而是你自己的消息 . 从那里你应该能够弄清楚为什么会发生这种情况并开始修复它 .