我想转移到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: - )
答案 0 :(得分:3)
您想要的是访问Curl实例的data
属性。您可以使用->
运算符执行此操作。
$curlInstance = new Curl("http://www.facebook.com");
$curlInstance->sCURL();
var_dump($curlInstance->data);
答案 1 :(得分:2)
对象不能在该上下文中用作数组(尽管它可以在foreach中)。
如果data
是public
,(它是),您可以像这样访问它:
$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。
最后一点,定义属性通常是一个好习惯,我想你忘记了类中数据属性的声明。