在本例中,如何正确返回类值?PHP

在本例中,如何正确返回类值?PHP,php,oop,return,instance,return-value,Php,Oop,Return,Instance,Return Value,我写了一个小爬虫,我想知道如何正确地将结果分配给被调用的实例 我的构造函数设置一些基本属性并调用下一个方法,该方法包含一个if循环,该循环可能调用foreach循环。当一切完成后,我回应我的结果 这很好,但我不想回显我的json_编码数据。我更希望底部的$crawler变量包含json_编码数据 这是我的代码: <?php class Crawler { private $url; private $class; private $regex;

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

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

这很好,但我不想回显我的json_编码数据。我更希望底部的$crawler变量包含json_编码数据

这是我的代码:

    <?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');

您不能在构造函数中执行此操作。但是您可以将json分配给一个类属性,并在另一个方法中返回它。这是唯一合乎逻辑的选择。

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

更改echo json_编码(['beers'=>this->elementsArray])

进入
$this->json=json_编码(['beers'=>$this->elementsArray])

然后

$crawler = new Crawler(....);
var_dump($crawler->json);
您可能会添加一个访问器方法,但公共属性也可以