PHP类返回值和设置变量

PHP类返回值和设置变量,php,curl,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 = "Moz

我想转向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;
现在是结果(有效):

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

如果尝试访问密钥“数据”,我会收到此错误

Fatal error: Cannot use object of type CURL as array in * on line 10
那么,如何直接访问数据(数组$data1['data'],您是否也可以更改我的类中的某些内容以使其更好?据我所知,为什么返回$data;在第一个示例类中不起作用。我搜索了又搜索,但没有找到答案。很抱歉,在我列出大量函数之前,我刚刚开始使用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 
我只是好奇,为什么我不能访问,如果它设置为真的,如果有人可以解释,我会很高兴

谢谢你抽出时间


祝大家圣诞快乐:-)对象不能在该上下文中用作数组(但可以在foreach中)

如果
数据
公共的
,您可以这样访问它:

$data1->data
但是,
数据
应该是
私有的
,并且应该通过getter函数访问:

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

对象不能在该上下文中用作数组(但可以在foreach中)

如果
数据
公共的
,您可以这样访问它:

$data1->data
但是,
数据
应该是
私有的
,并且应该通过getter函数访问:

$data->getData(); //Define getData() to return $this->data
在您的示例中:

$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);
另外,将属性保留为公共通常不是一种好的做法,更好的方法是将属性设置为私有并创建一些方法来访问它,这是call getter和setter示例:

class CURL {
    private $data;

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

    public function setDate($data) {
       $this->data = $data;
    }
}
使用getter和setter可以更好地控制数据,需要注意的是,在您的示例中不需要setter

最后一点,定义所有属性通常是一个很好的做法,我认为您忘记了类中数据属性的声明。

在您的示例中:

$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);
另外,将属性保留为公共通常不是一种好的做法,更好的方法是将属性设置为私有并创建一些方法来访问它,这是call getter和setter示例:

class CURL {
    private $data;

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

    public function setDate($data) {
       $this->data = $data;
    }
}
使用getter和setter可以更好地控制数据,需要注意的是,在您的示例中不需要setter


最后一点,定义所有属性通常是一个很好的做法,我认为您忘记了类中数据属性的声明。

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

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

您需要的是访问Curl实例的
数据
属性。您可以使用
->
操作符来完成此操作

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

谢谢你的回答,上面的答案现在起作用了:-)关于那个能手和二传手,我不知怎么搞不懂它,为什么它好,为什么它应该在里面。谢谢你的回答,上面的答案现在起作用了:-)关于那个能手和二传手,我不知怎么搞不懂它,为什么它好,为什么它应该在里面。谢谢你的权利。我在RageZ的回答中评论了关于getter和setter的事情,你可以在上面看到:)getter和setter的概念非常简单。您希望控制谁、如何以及何时访问您的属性。例如,您想计算一个变量被访问的次数,使用getter,您可以设置一个变量,并在每次调用函数时递增它。没有它,你就无法控制或节制财产。与setter相同,您无法控制是什么影响了您的属性,其中setter方法可以进行一些调整或验证,以查看所需的值是否符合程序的预期。谢谢您的权利。我在RageZ的回答中评论了关于getter和setter的事情,你可以在上面看到:)getter和setter的概念非常简单。您希望控制谁、如何以及何时访问您的属性。例如,您想计算一个变量被访问的次数,使用getter,您可以设置一个变量,并在每次调用函数时递增它。没有它,你就无法控制或节制财产。与setter相同,您无法控制是什么影响了您的属性,其中setter方法可以进行一些调整或验证,以查看所需的值是否符合程序的期望。