2013-02-21 62 views
0

我正在使用ScraperWiki構建一個簡單的屏幕抓取工具,從一家在線商店獲取鏈接。該商店有多個頁面,因此我想從第一個頁面獲取所有鏈接,在尋呼機中找到「下一個」按鈕,轉到該網址,從那裏找到所有鏈接,轉到下一頁,等等。等等。刮刀函數中的PHP變量

這就是我所在的地方。該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中?我在Stack上看到了幾個答案,這似乎暗示着不需要聲明,這看起來很奇怪。

+0

變量作用域依然存在。要麼使用參數,要麼邀請「全局」變量到每個函數中。 – mario 2013-02-21 23:28:48

+0

可能重複[從另一個片段調用函數時未定義的變量錯誤](http://stackoverflow.com/questions/14301958/undefined-variable-error-when-calling-a-function-from-another-snippet) – mario 2013-02-21 23:30:22

+0

@mario爲此歡呼,找不到一個好的參考。這裏的問題是,在函數被調用之前,變量沒有價值,所以我不能聲明它們。在上面的例子中,通過它們的最好方法是什麼? – Jascination 2013-02-21 23:34:57

回答

1

如果你表現出的整體錯誤,它可能會是這樣的

未定義的變量:$ getLinks

可能是因爲你的意思是這樣的: getLinks($nextUrl);

不是這: $getLinks($nextUrl);

它在nextPage函數之外正常工作,因爲您在那裏正確調用它。

+0

不,我得到:'PHP注意:未定義變量:當我嘗試在腳本結尾處運行'print_r($ allLinks);'時,第33行的/home/scriptrunner/script.php中的allLinks。 – Jascination 2013-02-21 23:44:54

+0

這意味着$ allLinks未定義。將其定義爲空數組。如果'for'循環從不運行,那麼$ allLinks永遠不會被定義。 – 2013-02-21 23:48:06

+0

使用'$ allLinks = array();'在包含之後,我想你會被設置。你的刮板沒有任何回報。 – 2013-02-21 23:55:00

0
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)

+0

他正在程序上構建它,他無意將它變成一個班級。 – 2013-02-21 23:39:33

+0

只是最佳實踐,我猜... – Drmjo 2013-02-21 23:44:32

+0

建立一個類並不總是最佳實踐。如果您不需要OOP的功能,那麼您無故添加開銷。 – 2013-02-21 23:45:53

0

從其他答案中找到了一些解決方案 - 必須在腳本開始處聲明$ allLinks,而不是在任何函數之外聲明。在Javascript中,這將是足以令它全球性的,但在PHP看起來你也必須聲明爲全局函數內部,就像這樣:

$allLinks = array(); 

function foo(){ 
    global $allLinks 
    ...//stuff 
} 

這終於得到了我的代碼工作。