poiuytrez3
Messages postés150Date d'inscriptiondimanche 28 septembre 2003StatutMembreDernière intervention17 mars 2009
-
24 févr. 2006 à 17:14
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 2015
-
26 mars 2006 à 10:26
Bonjour,
j'ai crée un objet php5 avec plusieurs membres privés.
J'ai donc crée une fonction
function __get($attribut){
return $this->attribut;
}
et pour accéder depuis l'extérieur à un membre de la classe, je fais:
personne->prenom();
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 24 févr. 2006 à 20:01
Au passage, si t'as une propriété en privée, je vois pas pourquoi tu va lui laisser le droit de l'utiliser hors classe.
Soit tu la met en public, soit tu la laisse en privée mais tu l'utilises autrement.
C'est hors concept Objet de mettre une propriété privée pour l'utiliser hors classe.
Autrement, la méthode magique __get() permet bien de récupérer une propriété qu'elle soit publique, privée ou protégée. Sauf que pour cela il faut faire autrement... :
class x {
private $test;
public function __get($var) {
return $this->$var;
}
}
Voici la classe type. Si tu veux récupérer $test, tu va faire :
$class = new x;
echo $class->test.
Hors la, tu ne passeras pas par la méthode __get() étant donné que ta propriétée $test est déja défini. Donc ==> Error, cannot access private property.
Pour contourner ca (mais je le déconseille très fortement !!!!!), il faut utiliser un tableau de propriétés :
class x {
private $test = array();
public function __get($var) {
return $this->test[$var];
}
}
Dans ce cas la, toutes tes données seront dans $test pour ta classe. Par exemple, si tu veux stocker un login, un email etc...
$this->test['login'] = 'moi';
$this->test['email'] = 'truc@lol.com';
Et pour pouvoir l'utiliser de l'extérieur :
$class = new x;
echo $class->login;
echo $class->email;
Et la ca marche.
Voici donc le truc pour faire de la lecture seulement sur les propriétés de classes. Seulement, je le déconseille. __get() n'a pas été programmé pour ca... .
micfrip
Messages postés21Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention 6 mars 2006 6 mars 2006 à 12:02
"Au passage, si t'as une propriété en privée, je vois pas pourquoi tu va
lui laisser le droit de l'utiliser hors classe.
Soit tu la met en public, soit tu la laisse en privée mais tu l'utilises autrement.
C'est hors concept Objet de mettre une propriété privée pour l'utiliser hors classe."
Je me permets de venir poster mon petit grain de sel car je ne suis pas du tout d'accord avec cette affirmation. (c'est juste constructif, pas pour démolir).
Lorsque tu cherches à récupérer des informations qui doivent subir un traitement, cela peut justement avoir de l'intérêt de créer un 'getter'. Ce principe est d'autant plus vrai avec des langages fortement typés comme C++ ou Java.
Personnelement, je n'utilise que très rarement des attributs publics.
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 6 mars 2006 à 12:22
Vrai, mais tu ne peux pas utiliser __get() pour récupérer une propriété de type PRIVATE ou PROTECTED.
Si t'arrives à faire :
class x {
private $z;
public function __get($var) {
return $this->$var;
}
}
$x = new x;
echo $x->z;
Et ca sans erreur, tu me diras comment tu fais. C'est totalement impossible. Voila pourquoi je dis qu'il faut faire attention avec __get().
Maintenant, retourner un index de tableau d'une propriété de classe, ca c'est faisable. C'es ce que j'ai marqué plus haut d'ailleurs il me semble :)
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 6 mars 2006 à 12:28
Hello,
heu chez moi cela fonctionne très bien...
<?php
class test {
private $myVar;
public function __construct () {
$this -> myVar = 'hidden';
}
public function __get ($prop) {
return $this -> $prop;
}
}
$obj = new test ();
echo $obj -> myVar;
?>
Je n'ai aucune erreur et 'hidden' m'est bien retourné.
Si je ne définis pas myVar, rien n'est retourné, mais toujours sans erreur.
micfrip
Messages postés21Date d'inscriptionmardi 4 mars 2003StatutMembreDernière intervention 6 mars 2006 6 mars 2006 à 12:47
Intéressant cette discussion.
Pour ma part, je n'utilise pas __get() et __set() mais des méthodes que je définis moi-même style
public function getMyVar() {
return($this->attribut);
}
Quel est l'avantage d'utiliser __get() et __set() ? Est-ce propre au php5 cette méthode ? Etant donné que je programme en java en parallèle, cela me perturbe un peu...
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 6 mars 2006 à 12:56
Y'a un bug ...
Moi j'ai :
Fatal error: Cannot access private property x::$y
Et voici le code que j'utilise :
<?php
class x {
private $y;
public function __get($var) {
return $this->$var;
}
}
$x = new x;
echo $x->y;
?>
Pareil si je tente de faire un constructeur en mettant : $this->y = 'meuh';
Même erreur si ca passe en protected.
Mais je crois savoir pourquoi... jdois avoir une vieille version de PHP5. Faut que j'aille voir si y'en a pas une nouvelle.
Voila sur quoi je traine :
Apache/1.3.33 (Win32) PHP/5.0.5
Dès PHP5.1, tu peux faire du __get/__set sur des propriétés privées (mais pas protégé je crois).
Malalam, tu peux me confirmer pour une propriété de type protected avec ta version ?
malalam
Messages postés10839Date d'inscriptionlundi 24 février 2003StatutMembreDernière intervention 2 mars 201025 6 mars 2006 à 13:02
micfrip => oui, ce sont des méthodes magiques propres à PHP5.
Ceci dit, dans ce cas précis, FhX a raison de dire que __get ne doit pas être employé. Il ne sert normalement pas à ça.
http://fr2.php.net/manual/fr/language.oop5.overloading.php pour un aperçu de cet ensemble de méthodes magiques.
Mais néanmoins, chez moi, ce code fonctionne.
Mais il faudrait utiliser une méthode autre (comme les tiennes par exemple).
FhX
Messages postés2350Date d'inscriptionmercredi 13 octobre 2004StatutMembreDernière intervention18 avril 20153 6 mars 2006 à 13:43
Ah bah c'est bon alors... c'est grâce à PHP5.1 que ca marche. Avant __get() ne passait pas pour des propriétés privées et protégées.
Je trouve ca moyen quand même... le fait de pouvoir acceder à des propriétées privées hors classes comme ca :/
Autant faire passer ca en public ! D'ailleurs, c'est pas parce qu'une propriétée est de type publique qu'elle est forcément à utiliser en mode écriture ! Tu peux aussi utiliser une propriétée publique en ReadOnly... suffit de faire attention à ce que tu codes !
Mais bon, si y'en a qui préfères créer autant de méthodes que de propriétés privées d'une classe... Parce que j'imagine bien 15 ou 20 propriétés de classes... avec 15 ou 20 méthodes simplement pour faire du (return $this->quelquechose).
Du grand n'importe quoi à mon avis... autant de temps perdu à coder et de perte de vitesse.