2011-12-24 2 views
1

Мне нужно переехать в ООП и пытаться понять это. Пока я сделал свой первый класс. Вот код. (Проблема с функцией SCURL() и возврата значений и доступ к нему правоВозвращаемые значения класса PHP и переменные установки

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 
} 

как вы можете видеть "данные" = 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........" 

Ok так это то, как я называю класс

$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']); 

, если попытаться получить доступ ключа «данных» я получаю эту ошибку

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

Итак, как я могу получить доступ к данным, прямой (массив $ data1 [ «данные»] и также, если бы вы что-то изменили из моего класса, чтобы сделать его лучше? И для моего понимания, почему это return $ data; в первом примере класс не работал. Я googled и googled, но не нашел ответа. Извините, я только что начал используя ООП до того, как я сделал огромный список функций.

UPDATE, когда я установил

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

Для ложной

curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 

я теперь могут получить доступ к данным

$ data1 [ 'данные'], но проблема как-то по-прежнему остается, $ data1 ['data'] отображается выше в конце, я получаю это:

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

им просто любопытно, почему я не могу получить доступ, если его установить true, если кто-нибудь может объяснить, что я был бы счастлив.

Спасибо за ваше время.

и

Рождеством ко всем :-)

ответ

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

Кроме того, это как правило, не является хорошей практикой, чтобы оставить общественности свойства, лучший подход должен сделать собственности частным и создать некоторые методы для доступа к нему, это называть и геттер сеттер примера:

class CURL { 
    private $data; 

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

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

Используя методы получения и установки у вас есть лучший контроль над данными, следует отметить, что в вашем примере не будет нужен сеттер.

Последний раз, это хорошая практика для определения свойства, я думаю, вы забыли объявление свойства данных в своем классе.

+0

Благодарим вас за ответ, приведенные выше работы теперь :-) о том, что геттер и сеттер, я как-то не понимаю его, для чего это хорошо и почему он должен быть. – user1015314

2

Объект не может быть использован в качестве матрицы в этом контексте (это может быть в Еогеасп, хотя).

Если data является public, (что он есть) вы можете получить доступ к нему, как так:

$data1->data 

Однако data должен быть private, и он должен быть доступен с функцией геттерной:

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

благодарит ваше право. Я комментирую ответ RageZ, о том, что касается геттера и сеттера, вы можете видеть выше :) – user1015314

+0

Концепция геттера и сеттера очень проста. Вы хотите контролировать, кто, как и когда ваша собственность будет доступна. Например, вы хотите подсчитать количество обращений к переменной, с помощью getter, вы можете установить переменную и увеличивать ее каждый раз, когда вызывается функция. Без этого у вас нет контроля или модерации над этим свойством. То же самое со установщиками, вы не можете контролировать, что возится с вашим свойством, где метод setter может выполнять некоторую умеренность или проверку, чтобы узнать, соответствует ли желаемое значение ожиданиям программы. –

3

Что вы хотите получить доступ к свойству Curl data. Вы делаете это с помощью оператора ->.

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

благодарит ваше право. – user1015314

Смежные вопросы