OVH Cloud OVH Cloud

PHP5, objets et variables private

4 réponses
Avatar
remi.rousset
Bjr,
J'utilise php5 dans un Developpement Objet.
Les attributs de mes classes sont déclarés en private.
Auparavant (en php 4 ), je pouvais lister les attributs de ma classe
(déclarés par défaut en public), par le biais d'un foreach(monobjet
as $attribut => valeur).

Avec ds attributs private cela devient bien sur impossible.
Existe t il un moyen de parcouris les attributs privés de ma classe
autrement que par ce foreahc devenu oboslete, ou bien suuis je obligé
d'appeler un a un mes attributs avec mes getters ?

D'avance merci.
Salutations.

4 réponses

Avatar
Clifden

Avec des attributs private cela devient bien sur impossible.


Normal, c'est le but du private :-)

Existe t il un moyen de parcouris les attributs privés de ma classe
autrement que par ce foreach devenu obsolete, ou bien suis je obligé
d'appeler un a un mes attributs avec mes getters ?


tu es obligé de passer par des fonctions, donc des getters

par contre, est-ce que quelqu'un a joué avec les __get et __set ??

j'ai eu des comportements bizarre avec, par exemple:

class foo {
private $bar="test";

public function __construct() {
}

public function __get($name) {
if ($name=="bar")
return $this->bar;
}
}

$a=new foo();
echo $a->bar;

ca ne marchais pas, je me prenais un error, car php5 pensais que je
voulais acceder à bar directement, sans passer par la magic function __get.

Tous les exemples que j'ai vu sur le net faisaient état d'une variable
interne privée de type tableau associatif, et les magic function __get
et __set se contentait d'acceder à la clé voulue dans ce tableau en
lecture ou en ecriture. Mais ce n'est pas génial ni lisible au niveau de
la classe que de n'avoir qu'une seule variable tableau, avec les vraies
données dedans. Enfin je trouve...

Quelqu'un a plus d'experience?

--
Julien PACHET

Avatar
cleo
Existe t il un moyen de parcourir les attributs privés de ma classe


Salut,
Oui ... fais des recherches sur la classe "Reflection"

--
Cléo.

Avatar
cleo

Salut,
Oui ... fais des recherches sur la classe "Reflection"



ici par exemple:
http://www.nexen.net/docs/php/annotee/language.oop5.reflection.introduction.php

--
Cléo

Avatar
cleo
Oui ... fais des recherches sur la classe "Reflection"
En fait, Non ...


Les classes "ReflectionXX" te permettent en effet d'introspecter la
structure [de fonction ou] d'object, mais ne permet en aucun cas de
contourner l'accessibilité de leurs propriétés ou méthodes.

Pour confirmer:
class Test
{
private $_var = 10 ;
private function getVar() { return $this->_var; }
}

$z = new Test();
$rc = new ReflectionClass("Test");
$rp = $rc->getProperty("_var");
$rm = $rc->getMethod("getVar");

echo "Test._var:".$rp->getValue($z); //->ERREUR
echo "Test.getVar:".$rm->invoke($z); //->ERREUR


Désolé de n'avoir pas pris le temps de vérifier l'info avant.
--
Cléo