Objet php5 surdéfinition de fonctions

poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009 - 24 févr. 2006 à 17:14
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 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();

mais j'obtient une erreur.

Merci de votre aide.

29 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 17:21
Hello,

ce code fonctionne :

<?php
class test {


private $myVar;


public function __construct () {
$this -> myVar = 'hidden';
}


public function __get ($prop) {
return $this -> myVar;
}
}


$obj = new test ();
echo $obj -> myVar;
?>

Je pense donc que tu as dû faire une erreur quelquepart.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 17:21
Oups pardon je recommence ;-)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 17:22
<?php
class test {


private $myVar;


public function __construct () {
$this -> myVar = 'hidden';
}


public function __get ($prop) {
return $this -> $prop;
}
}


$obj = new test ();
echo $obj -> myVar;
?>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 17:22
Et du coup je vois : tu as oublié le $ devant 'attribut'.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009
24 févr. 2006 à 17:44
Merci de t'occuper de moi.
J'ai essayé ton code mais j'obtiens :

Fatal error: Cannot access private property
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 17:51
Alors, c'est que ta version de PHP5 ne supporte pas la méthode magique __get ().

Parce que chez moi, le code (les deux d'ailleurs) que je t'ai donné fonctionne à merveille.

Maintenant, il y a tout aussi simple hein... :

<?php
class test {


private $myVar;


public function __construct () {
$this -> myVar = 'hidden';
}


public function myGet ($prop) {
if (isset ($this -> $prop)) {
return $this -> $prop;
}
}
}


$obj = new test ();
echo $obj -> myGet ('myVar');
?>
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
24 févr. 2006 à 18:02
Voire même, pour affiner et jouer un peu :

<?php
class test {


private $myVar;
private $myVeryPrivateVar;


private $aForbid = array ('myVeryPrivateVar', 'aForbid');


public function __construct () {
$this -> myVar = 'hidden';
}


public function myGet () {
$aReturn = array ();
$aProps = func_get_args ();
foreach ($aProps as $prop) {
if (isset ($this -> $prop) && !in_array ($prop, $this -> aForbid)) {
$aReturn[$prop] = $this -> $prop;
}
}
return $aReturn;
}
}


$obj = new test ();
print_r ($obj -> myGet ('myVar', 'myVeryPrivateVar'));
?>
0
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009
24 févr. 2006 à 18:32
C'est pas grave, je ferai sans alors.

Merci quand même.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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... .

Voila. !
0
poiuytrez3 Messages postés 150 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 17 mars 2009
25 févr. 2006 à 15:10
Merci. C'est très sympa de m'avoir aidé. J'ai maintenant les idées plus claires sur le __get.



@+
0
micfrip Messages postés 21 Date d'inscription mardi 4 mars 2003 Statut Membre Derniè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.

Voilà voilà...
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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 :)

Voila ;)
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
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.
0
micfrip Messages postés 21 Date d'inscription mardi 4 mars 2003 Statut Membre Derniè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...
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
6 mars 2006 à 13:02
Okay, j'ai trouvé pourquoi...faudrait que je lise les changelog un peu plus souvent :

(PHP5.1 overloading, Cannot access private property).

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 ?
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
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).
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
6 mars 2006 à 13:11
FhX => non, j'y arrive aussi en protected.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
6 mars 2006 à 13:12
Et je suis en 5.1.1, au passage.
0
FhX Messages postés 2350 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 18 avril 2015 3
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.

Mais bon... :)
0
Rejoignez-nous