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');
我正在编写一个函数,用于从 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');