Я пишу функцию для возврата веб-сканера, либо из 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;
}
}
}
В нынешнем виде это приводит к тому, что в программе позже возникает другая функция (функция с 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'){...}
который оценивает к истине и печатает, проверка работоспособности отличается от
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!
Соответствующий вызов (после извлечения 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');