PHP класс, возвращающий значения и устанавливающий переменные - PullRequest
1 голос
/ 24 декабря 2011

Я хотел перейти на ООП и пытаться понять это.Пока я сделал свой первый класс.Вот кодекс.(Проблема в функции 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
}

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

, это дает мне приведенные выше результаты. Вот моя проблема, я хочу получить доступ только к «ДАННЫМ».

$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 ['data '] , а также измените ли вы что-нибудь из моего класса, чтобы сделать его лучше? И для моего понимания, почему это вернуло $ data; в первом примере класса не сработало. Я гуглил иГуглил, но не нашел ответа. Извините, я только начал использовать ООП, прежде чем сделал огромный список функций.

ОБНОВЛЕНИЕ, когда я установил

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

в false

curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 

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

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

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

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

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

и

С Рождеством Христовым всем: -)

Ответы [ 3 ]

3 голосов
/ 24 декабря 2011

Вам нужно получить доступ к свойству data вашего экземпляра Curl.Вы делаете это с оператором ->.

$curlInstance = new Curl("http://www.facebook.com");
$curlInstance->sCURL();
var_dump($curlInstance->data);
2 голосов
/ 24 декабря 2011

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

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

$data1->data

Однако, data должно быть private, и к нему следует обращаться с помощью функции получения:

$data->getData(); //Define getData() to return $this->data
0 голосов
/ 24 декабря 2011

В вашем примере:

$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;
    }
}

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...