PHP переменные в функции скребка
Я использую ScraperWiki для создания простого скребка для экрана, получающего ссылки из интернет-магазина. В магазине несколько страниц, поэтому я хочу получить все ссылки с первой страницы, найти кнопку "Далее" в пейджере, перейти по этому URL, найти все ссылки оттуда, перейти на следующую страницу и так далее, и так далее.
Вот где я. ScraperWiki использует простые HTML DOM и CSS селекторы:
<?php
require 'scraperwiki/simple_html_dom.php';
function nextPage(){
$next = $html->find("li.pager-next a");
$nextUrl = 'http://www.domain.com';
$nextUrl .= $next->href . "\n";
getLinks($nextUrl);
}
function getLinks($url){ // gets links from product list page
$html_content = scraperwiki::scrape($url);
$html = str_get_html($html_content);
$x = 0;
foreach ($html->find("div.views-row a.imagecache-product_list") as $el) {
$url = $el->href . "\n";
$allLinks[$x] = 'http://www.domain.com';
$allLinks[$x] .= $url;
$x++;
}
nextPage();
}
getLinks("http://www.domain.com/foo/bar");
print_r($allLinks);
?>
getLinks()
Функция отлично работает, когда НЕ в функции, но я получаю ошибки "необъявленные переменные", когда я помещаю их в функцию. Мой вопрос:
В PHP я могу объявить пустые переменные / массивы для использования в скрипте, как в Javascript? Я прочитал несколько ответов здесь, в стеке, который, кажется, подразумевает, что нет необходимости объявлять, что кажется странным.
3 ответа
Если бы вы показали всю ошибку, это, вероятно, было бы что-то вроде
Неопределенная переменная: $getLinks
Вероятно потому, что вы имели в виду следующее: getLinks($nextUrl);
Не это: $getLinks($nextUrl);
Работает нормально за пределами nextPage
функция, потому что вы называете это правильно там.
class ScraperWiki{
public $variable;
protected $variable;
private $variable;
// here you have the option of choosing how your functions and variables are treated...
private function getLinks(){...}
public function someOtherFunction(){
$this->getLinks(); //will call the function in this Class
}
}
Плюс у вас есть синтаксис Ошибка $getLinks($nextUrl); должен быть getLinks ($ nextUrl)
Сам нашел решение с небольшой помощью других ответов - пришлось объявить $allLinks в начале скрипта, вне каких-либо функций. В Javascript этого было бы достаточно, чтобы сделать его глобальным, но в PHP это выглядит так, как будто вы должны также объявить его как глобальные функции INSIDE, например так:
$allLinks = array();
function foo(){
global $allLinks
...//stuff
}
Это наконец заставило мой код работать.