2011-12-24 4 views
1

Je voulais passer à la POO et essayer de le comprendre. Jusqu'ici j'ai fait mon premier cours. Voici le code. (Le problème est avec la fonction SCURL() et les valeurs de retour et d'y accéder droitClasse PHP renvoyant des valeurs et des variables de réglage

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

et ce sont les résultats.

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 
} 

comme vous pouvez le voir « données » = NULL.

que j'ai remplacé cette paix du Code

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

    return $data; 

avec ceci:

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

    return $this->data; 

et maintenant ce sont les résultats (de travail):

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, donc voilà comment j'appelle la classe

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

var_dump($data1); 

cela me donne les résultats ci-dessus . Voici mon problème, je veux accéder uniquement à la chose "DATA".

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

var_dump($data1['data']); 

si essayez d'accéder à 'données' clé que je reçois cette erreur

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

Alors, comment je peux accéder aux données, directement (le tableau $ data1 [ 'data'] et Aussi, pourriez-vous changer quelque chose de ma classe pour le rendre meilleur? Et pour ma compréhension, pourquoi retournent $ data; dans la première classe d'exemple non travaillée.J'ai googlé et googlé mais n'ai pas trouvé de réponse Désolé, je viens de commencer en utilisant OOP avant de faire une énorme liste de fonctions

MISE À JOUR quand je mis

curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); 

à false

curl_setopt($ch, CURLOPT_RETURNTRANSFER, false); 

je peux maintenant accéder aux données

$ data1 [ 'data'], mais le problème en quelque sorte reste, $ data1 ['data'] est affiché ci-dessus à la fin je reçois ceci:

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

Im juste curieux, pourquoi je ne peux pas accéder si son ensemble est vrai, si quelqu'un peut m'expliquer que je serais heureux.

Nous vous remercions de votre temps.

et

MERRY XMAS :-) À TOUS

Répondre

0

Dans votre exemple:

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

var_dump($data1['data']); 

$ data1 est un objet, vous ne pouvez pas utiliser un objet en tant que tableau (sauf si vous définissez une interface spécifique).

Ce que vous pouvez faire serait quelque chose comme

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

var_dump($data1->data); 

En outre, il est généralement pas une bonne pratique de laisser publique les propriétés, une meilleure approche est de rendre la propriété privée et créer des méthodes pour y accéder, il est appel getter et setter exemple:

class CURL { 
    private $data; 

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

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

en utilisant getter et setter vous avez un meilleur contrôle sur les données, à noter que dans votre exemple, le compositeur ne sera pas nécessaire.

Dernier point, c'est généralement une bonne pratique de définir al la propriété, je pense que vous avez oublié la déclaration de la propriété de données dans votre classe.

+0

merci pour votre réponse, les travaux ci-dessus fonctionne maintenant :-) sur ce getter et setter, je ne comprends pas en quelque sorte, pour ce qui est bon et pourquoi il devrait être po – user1015314

2

Un objet ne peut pas être utilisé comme un tableau dans ce contexte (il peut être dans un foreach bien).

Si data est public, (ce qui est), vous pouvez y accéder comme ceci:

$data1->data 

Cependant, data devrait être private, et il devrait être consulté avec une fonction getter:

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

merci de votre droit. Je commente dans la réponse RageZ, à propos de la chose getter et setter, vous pouvez voir ci-dessus :) – user1015314

+0

Le concept getter et setter est très simple. Vous voulez contrôler qui, comment et quand votre propriété est accessible. Par exemple, vous voulez compter le nombre de fois qu'une variable a été accédée, avec un getter, vous pouvez définir une variable et l'incrémenter chaque fois que la fonction est appelée. Sans cela, vous n'avez aucun contrôle ou modération sur la propriété. Pareil avec les setters, vous ne pouvez pas contrôler ce qui se passe avec votre propriété, où une méthode setter pourrait faire un peu de modération ou de validation pour voir si la valeur désirée correspond aux attentes du programme. –

3

Ce que vous voulez, c'est accéder à la propriété data de votre instance Curl. Vous faites cela avec l'opérateur ->.

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

merci votre droite. – user1015314

Questions connexes