PHP类返回值和设置变量

时间:2011-12-24 15:30:44

标签: php curl

我想转移到OOP,并试图了解它。到目前为止,我上了第一堂课。这是守则。 (问题在于函数 sCURL()并返回值并正确访问它。

    class CURL {

    public $url; 
    private $header = false; // DISPLAY HEADERS (FALSE OR TRUE)
    private $follow = true; // FOLLOW REDIRCETS (FALSE OR TRUE)
    private $useragent = "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)"; // SET USER AGENT e.g. "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)"
    private $referer = "http://www.google.com"; // SET REFERER e.g. http://www.google.com
    private $ssl = false; // If set false (it accpets any ssl) should false
    private $ctimeout = 5; // Timeout for connect in SECs when curl does next url
    private $timeout = 60; // Timeout of retriving page in SECs when curl does next url


    public function setHeader($header) {
        $this->header = $header;
    }
    public function setFollow($follow) {
        $this->follow = $follow;
    }
    public function setUseragent($useragent) {
        $this->useragent = $useragent;
    }
    public function setReferer($referer) {
        $this->referer = $referer;
    }
    public function setSsl($ssl) {
        $this->ssl = $ssl;
    }
    public function setCtimeout($ctimeout) {
        $this->ctimeout = $ctimeout;
    }
    public function setTimeout($timeout) {
        $this->timeout = $timeout;
    }
    public function __construct($url) {
        $this->url = $url;
    }

    public function sCURL() {

        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $this->url);
        curl_setopt($ch, CURLOPT_HEADER, $this->header);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->follow);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_USERAGENT, $this->useragent);
        curl_setopt($ch, CURLOPT_REFERER, $this->referer);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, $this->ssl);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $this->ctimeout);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);

        $data = curl_exec($ch);
        curl_close($ch);

        return $data;
    }
}

这就是结果:

object(CURL)#1 (9) {
  ["url"]=>
  string(23) "http://www.facebook.com"
  ["header:private"]=>
  bool(false)
  ["follow:private"]=>
  bool(true)
  ["useragent:private"]=>
  string(49) "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)"
  ["referer:private"]=>
  string(21) "http://www.google.com"
  ["ssl:private"]=>
  bool(false)
  ["ctimeout:private"]=>
  int(5)
  ["timeout:private"]=>
  int(60)
  ["data"]=>
  NULL
}

你可以看到“data”= NULL。

比我取代了这段代码的和平

    $data = curl_exec($ch);
    curl_close($ch);

    return $data;

用这个:

    $this->data = curl_exec($ch);
    curl_close($ch);

    return $this->data;

现在这是结果(工作):

object(CURL)#1 (9) {
  ["url"]=>
  string(23) "http://www.facebook.com"
  ["header:private"]=>
  bool(false)
  ["follow:private"]=>
  bool(true)
  ["useragent:private"]=>
  string(49) "Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.1)"
  ["referer:private"]=>
  string(21) "http://www.google.com"
  ["ssl:private"]=>
  bool(false)
  ["ctimeout:private"]=>
  int(5)
  ["timeout:private"]=>
  int(60)
  ["data"]=>
  string(33320) "<!DOCTYPE html>.........STRIPPED OUTBUT THATS WHAT I WANTED........"

好的,这就是我打电话给班级的方式

$data1 = new Curl("http://www.facebook.com");
$data1->sCURL();

var_dump($data1);

这给了我上面的结果。这是我的问题,我只想访问“DATA”的东西。

$data1 = new Curl("http://www.facebook.com");
$data1->sCURL();

var_dump($data1['data']);

如果尝试访问密钥'data',我会收到此错误

Fatal error: Cannot use object of type CURL as array in * on line 10

那么,我如何访问数据,直接(数组 $ data1 ['data'] ,你也会从我的班级改变一些东西以使其更好吗?而且据我所知,为什么返回$ data; 在第一个示例类中没有用。我用Google搜索并用谷歌搜索但没有找到答案。抱歉,我刚刚开始使用OOP之后才制作了大量的函数。

我设置

时更新
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

为假

curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 

我现在可以访问数据

$ data1 ['data'] ,但问题仍然存在,$ data1 ['data']会在最后显示在上面我得到这个:

Fatal error: Cannot use object of type CURL as array in * on line 
我只是很好奇,如果有人能解释我会很开心,为什么我无法访问它。

感谢您的时间。

MERRY XMAS TO ALL: - )

3 个答案:

答案 0 :(得分:3)

您想要的是访问Curl实例的data属性。您可以使用->运算符执行此操作。

$curlInstance = new Curl("http://www.facebook.com");
$curlInstance->sCURL();
var_dump($curlInstance->data);

答案 1 :(得分:2)

对象不能在该上下文中用作数组(尽管它可以在foreach中)。

如果datapublic,(它是),您可以像这样访问它:

$data1->data

但是,data应为private,并且应使用getter函数进行访问:

$data->getData(); //Define getData() to return $this->data

答案 2 :(得分:0)

在你的例子中:

$data1 = new Curl("http://www.facebook.com");
$data1->sCURL();

var_dump($data1['data']);

$ data1是一个对象,不能将对象用作数组(除非您定义了特定的接口)。

你能做的就像是

$data1 = new Curl("http://www.facebook.com");
$data1->sCURL();

var_dump($data1->data);

将公共属性保留为公共通常并不是一个好习惯,更好的方法是将属性设为私有并创建一些方法来访问它,它是调用getter和setter的例子:

class CURL {
    private $data;

    ...
    public function getData() {
       return $this->data;
    }

    public function setDate($data) {
       $this->data = $data;
    }
}

使用getter和setter可以更好地控制数据,需要注意的是,在您的示例中,不需要setter。

最后一点,定义属性通常是一个好习惯,我想你忘记了类中数据属性的声明。