【问题标题】:How to return class value properly in this example? PHP在这个例子中如何正确返回类值? PHP
【发布时间】:2016-03-20 14:17:07
【问题描述】:

我写了一个小爬虫,我想知道如何正确地将结果分配给被调用的实例。

我的构造函数设置了一些基本属性并调用包含 if 循环的 next 方法,该循环可能会调用 foreach 循环。当一切都完成后,我会回显我的结果。

这工作得很好,但我不想回显我的 json_encode 数据。我宁愿希望底部的 $crawler 变量包含 json_encode 数据。

这是我的代码:

    <?php

class Crawler {

    private $url;
    private $class;
    private $regex;
    private $htmlStack;
    private $pageNumber = 1;
    private $elementsArray;

    public function __construct($url, $class, $regex=null) {
        $this->url = $url;
        $this->class = $class;
        $this->regex = $regex;

        $this->curlGet($this->url);
    }

    private function curlGet($url) {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_URL, $url);

        $this->htmlStack .= curl_exec($curl);

        $response = curl_getinfo($curl, CURLINFO_HTTP_CODE);

        $this->paginate($response);
    }

    private function paginate($response) {
        if($response === 200) {
            $this->pageNumber++;
            $url = $this->url . '?page=' . $this->pageNumber;

            $this->curlGet($url);
        } else {
            $this->CreateDomDocument();
        }
    }

    private function curlGetDeep($link) {
        $curl = curl_init();

        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($curl, CURLOPT_URL, $link);

        $product = curl_exec($curl);

        $dom = new Domdocument();
        @$dom->loadHTML($product);

        $xpath = new DomXpath($dom);

        $descriptions = $xpath->query('//div[contains(@class, "description")]');

        foreach($descriptions as $description) {
            return $description->nodeValue;
        }
    }

    private function CreateDomDocument() {
        $dom = new Domdocument();
        @$dom->loadHTML($this->htmlStack);

        $xpath = new DomXpath($dom);

        $elements = $xpath->query('//article[contains(@class, "' . $this->class . '")]');

        foreach($elements as $element) {
            $title = $xpath->query('descendant::div[@class="title"]', $element); 
            $title = $title->item(0)->nodeValue;

            $link = $xpath->query('descendant::a[@class="link-overlay"]', $element); 
            $link = $link->item(0)->getAttribute('href');
            $link = 'https://www.gall.nl' . $link;

            $image = $xpath->query('descendant::div[@class="image"]/node()/node()', $element);
            $image = $image->item(1)->getAttribute('src');

            $description = $this->curlGetDeep($link);

            if($this->regex) {
                $title = preg_replace($this->regex, '', $title);
            }

            if(!preg_match('/\dX(\d+)?/', $title)) {
                $this->elementsArray[] = [
                    'title' => $title,
                    'link' => $link,
                    'image' => $image,
                    'description' => $description
                ];
            }       
        }

        echo json_encode(['beers' => $this->elementsArray]);
    }
}

$crawler = new Crawler('https://www.gall.nl/shop/speciaal-bier/', 'product-block', '/\d+\,?\d*CL/i');

Github 链接了解更多概览: https://github.com/stephan-v/crawler/blob/master/ArticleCrawler.php

希望有人可以帮助我,因为我在这里有点困惑如何让它正常工作。

【问题讨论】:

    标签: php oop return instance return-value


    【解决方案1】:

    你不能在构造函数中这样做。但是您可以将 json 分配给类属性并以另一种方法返回。这是唯一合乎逻辑的选择。

    【讨论】:

      【解决方案2】:

      我太慢了……伙计。所以我只是在这里用代码扩展 ardabeyazoglu 答案:

      更改echo json_encode(['beers' =&gt; $this-&gt;elementsArray]);

      转入$this-&gt;json = json_encode(['beers' =&gt; $this-&gt;elementsArray]);

      然后

      $crawler = new Crawler(....);
      var_dump($crawler->json);
      

      您可以添加访问器方法,但公共属性也可以。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-13
        • 2019-12-02
        • 2012-12-04
        • 2011-09-18
        • 2013-04-25
        • 2012-04-22
        • 2020-05-18
        • 1970-01-01
        相关资源
        最近更新 更多