Objet

Signaler
Messages postés
103
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
30 avril 2007
-
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
-
Salut à tous !

Comment je peux récupérér un attribut d'un objet ? Cette ligne est correcte ?



echo "<tr><td>Adresse e-mail: </td><td>mail."></td></tr>"; //avant j'avais $row[7] à la place.

8 réponses

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



oui, si tu veux acceder a une propriete membre d'un objet, tu dois bien faire ca.



$objet -> propriete



Apres, mieux t'aider impliquerait de savoir comment est structuree la classe.



Est-ce que ta ligne est correcte...heu...plus ou moins. Moi je sortirais le php, la, et tes attributs n'ont pas de guillemets :

<tr><td>Adresse e-mail: </td><td>mail; ?>" /></td></tr>
Messages postés
103
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
30 avril 2007

Notice: main() [[function.main function.main]]: The script
tried to execute a method or access a property of an incomplete object. Please
ensure that the class definition "BDMembres" of the object you are trying to
operate on was loaded _before_ unserialize() gets called or provide a
__autoload() function to load the class definition in
d:\kalisport\KaliNet\site\espace_membre\infos_perso.php on line
29



il le prend pas. Je te met ma classe AllMembre



<?php

require_once('BDmembres.php');

class ClassAllMembres {

private $_proprietes = array('_TOMembres','_dataOK');



public function __construct() {

$this->_TOmembres = array();

$this->_dataOK = $this->chargerAllMembres();

}



public function chargerAllMembres() {

$req = 'SELECT * FROM membres';

if (!$result = $GLOBALS['_hBD']->executerRequeteRes($req)) {

echo 'Aucun membre chargé pour S' . $this->_id_membre .'
';

return false;

}

foreach ($result as $row) {


$this->_TOMembres [$row['id_membre']] = new
BDMembres($row['id_membre'],$row['nom'],$row['prenom'],$row['sexe'],$row['naissance'],$row['cp'],$row['mail'],$row['mdp'],$row['url'],$row['infos_comp'],$row['url'],$row['tel']);


}

return true;

}



public function authentifier($mail, $mdp){

foreach ($this->_TOMembres as $OMembre) {

if
($OMembre->_mail $mail and $OMembre->_mdp $mdp) return
$OMembre;

}

return false;

}

}

?>
Messages postés
103
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
30 avril 2007

dsl pour l'allure de mon code en postant ç'est parti en sucette.
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

Salut,



connais tu la POO, car moi en tant qu'interpreteur PHP je capte



propriétés :

$_proprietes[0] = '_TOMembres';

$_proprietes[1] = '_dataOK';



méthodes :

__construct()

chargerAllMembres()

authentifier($mail, $mdp);



de plus dans ta methode authentifier, tu utilises $OMembre->_mail, essaye avec ca mais je ne garantis rien



Au fait as tu testé tes différentes méthodes, je ne suis pas sur que ca marche.

Si tout marche, je voudrais bien que tu m'expliques comment t'as fait
car, je pense comprendre ton idée mais je vois pas comment ca marche
dans le cas présent


"They are 10 sorts of persons whose understand binary and whose not"
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



ouais, plusieurs problemes la.

En effet tes variables membres ne sont pas correctes. De plus, ton
$proprietes est prive, et ne peut donc pas etre accede a l'exterieur de
ta classe.

Tu dois declarer au moins public ce membre :

public $TOMembres;



Apres dans ton constructeur, tu peux mettre ca :

$this->_TOmembres = array();



et acceder a _TOmembres a l'exterieur de ta classe.

Ensuite quand tu utilises ca :

$GLOBALS['_hBD']->executerRequeteRes($req)



$GLOBALS['_hBD'], c'est quoi ? C'est bien un objet declare...? Ou ? Quand ?

Ensuite, tu fais de _TOmembres un tableau indice avec l'id d'un
utilisateur, contenant un objet avec des proprietes que l'on ne connait
pas.

Mettons que BDmembre aient une propriete : public $email dans lequel tu
mets le resultat de $row['email'], tu y accederas, si tu veux passer
par cette classe, ainsi :

echo $objetMembre -> _TOmembres[$idmembre] -> email;



Mais je suis comme Garfield, je ne suis pas sur que ton bazar fonctionne, et ca me semble bien complique comme facon de faire.
Messages postés
103
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
30 avril 2007

Je suis obligé de me servir de ces classes car on est plusieurs à s'en
servir. Par contre ce qui est chiant, c'est d'avoir à recoder un espace
membre fonctionnel en objet...

Alors je vais vous mettre les classes dont je me sers.



//ClassAllMembres

<?php

require_once('BDmembres.php');

class ClassAllMembres {

public $_proprietes = array('_TOMembres','_dataOK'); //Je l'ai passé en public comme demandé

public function __construct() {

$this->_TOmembres = array();

$this->_dataOK = $this->chargerAllMembres();

}



public function chargerAllMembres() {

$req = 'SELECT * FROM membres';

if (!$result = $GLOBALS['_hBD']->executerRequeteRes($req)) {

echo 'Aucun membre chargé
';

return false;

}

foreach ($result as $row) {


$this->_TOMembres [$row['membreID']] = new
BDMembres($row['membreID'],$row['nom'],$row['prenom'],$row['sexe'],$row['naissance'],$row['cp'],$row['mail'],$row['mdp'],$row['url'],$row['infos_comp'],$row['tel']);


}

return true;

}



public function authentifier($mail, $mdp){

foreach ($this->_TOMembres as $OMembre) {

if
($OMembre->_mail $mail and $OMembre->_mdp $mdp) return
$OMembre;

}

return false;

}

}

?>



////Class BDMembre

public $_proprietes = array('_membreID', '_nom',
'_prenom', '_sexe', '_naissance', '_cp', '_mail', '_mdp', '_url',
'_infos_comp', '_tel');

//constructeur

public function __construct($membreID = DUMMY_INT,
$nom DUMMY_INT, $prenom DUMMY_INT, $sexe = DUMMY_INT, $naissance =
DUMMY_INT, $cp DUMMY_INT, $mail DUMMY_INT, $mdp = DUMMY_INT, $url =
DUMMY_INT, $infos_comp DUMMY_INT, $tel DUMMY_INT) {

if ($membreID == DUMMY_INT or
$nom DUMMY_INT or $prenom DUMMY_INT or $sexe == DUMMY_INT or
$naissance DUMMY_INT or $cp DUMMY_INT or $mail == DUMMY_INT or
$mdp DUMMY_INT or $url DUMMY_INT or $infos_comp == DUMMY_INT or
$tel == DUMMY_INT) {

if ($membreID == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($nom == DUMMY_INT) {


echo 'nom non renseigné dans la
construction de la classe BDMembres
';

}

if ($prenom == DUMMY_INT) {


echo 'prenom non renseigné dans
la construction de la classe BDMembres
';

}

if ($sexe == DUMMY_INT) {


echo 'sexe non renseigné dans la
construction de la classe BDMembres
';

}

if ($membreID == DUMMY_INT) {


echo 'naissance non renseigné
dans la construction de la classe BDMembres
';

}

if ($cp == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($mail == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($mdp == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($url == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($infos_comp == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';

}

if ($tel == DUMMY_INT) {


echo 'membreID non renseigné dans
la construction de la classe BDMembres
';


}


throw new Exception();

}

$this->_TOmembres = array(); //rajouté comme conseill

$this->_membreID = $membreID;

$this->_nom = $nom;

$this->_prenom = $prenom;

$this->_sexe = $sexe;

$this->_naissance = $naissance;

$this->_cp = $cp;

$this->_mail = $mail;

$this->_mdp = $mdp;

$this->_url = $url;

$this->_infos_comp = $infos_comp;

$this->_tel = $tel;

}



public function __set($nom, $valeur ) {

if (!in_array($nom,$this->_proprietes,true)) {

echo 'propriete ' .$nom .' INCONNUE pour objet Membres
';

throw new Exception();

}

$this->_proprietes[$nom] = $valeur;

}



public function __get($nom) {

if (!in_array($nom,$this->_proprietes,true)) {

echo 'propriete ' .$nom .' INCONNUE pour objet Membres
';

throw new Exception();

}

return $this->_proprietes[$nom];

}

}

?>

////////////////////



$GLOBALS['_hBD'] c'est un objet de connexion à la base

Voilà comment je gère la connexion d'un membre



$GLOBALS['_hBD'] = new ClassBD();

$OAllmembres = new ClassAllMembres();

if (!$OMembre = $OAllmembres->authentifier($mail,$mdp)) {

echo
"

<center>Erreur
cet email (et/ou mot de passe) est
incorrect!</center>
";

}

else {

//connexion établie

//-------------Cookies-----------------

setcookie('mail', $mail, time()+2592000); //délai d'un mois

setcookie('mdp', $mdp, time()+2592000);

//-------------Session-----------------

$_SESSION['OMembre']= $OMembre;//je m'en sers comme variable de session, comme ça je peux (je voudrais) accéder à ses propriétés

header('Location: espace_membre.php?page=3');//redirection page membre
Messages postés
388
Date d'inscription
lundi 7 juillet 2003
Statut
Webmaster
Dernière intervention
10 février 2009

Es tu sur que tes classes fonctionnent ( ce qui ne veut pas dire pas de probleme de parsage )



teste toutes tes methodes et regardes si les propriétés ont bien les valeurs attendues.



perso, je ferai plutot une classes dans ce genre.



<?php

require_once('BDmembres.php');

class ClassAllMembres {



// déclaration de mes propriétés

private $_TOMembres:

private $_dataOK;



// déclaration des méthodes

private function __construct()

{

$this->_TOmembres = array();

$this->_dataOK = $this->chargerAllMembres();

}



etc.



car dans ton cas, je crois que pour acceder a tes propriétés tu dois faire



private function __construct()


{


$this->_proprietes[0] = array(); // _TOmembres


$this->_proprietes[1] = $this->chargerAllMembres(); // _dataOK


}



ce que je ne trouve pas très lisible mais bon, j'ai pas tester et je trouve que ton source n'est pas très clair.



en fait, je ne ferai pas une classe spécifique classAllMembres mais une fonctions qui retourne un tableau d'objet



genre

private function listAllMembre()

{

// requetes qui recupere les id de tous les membres

while ( $array = mysql_fetchrow($result) )

{

$ret[] = new membre($array['id']);

}

return $ret;

}



utilisation :

$tab_listMembres = $objMembre->listAllMembres();

foreach ( $tab_listMembres as $objUnMembre )

{

echo $objUnMembre->id,' - ', $objUnMembre->nom,'
';

}



sachant que toujours perso, je fais une methode de lecture et d'ecriture de chaque propriété



Fais ce que tu veux de ces pistes, je pense que tu es parti sur une mauvaise base pour l'utilisation des objets.



Vois avec tes collegues pour qu'il t'explique la facon dont il utilise la classe car moi je la comprends pas des masses


"They are 10 sorts of persons whose understand binary and whose not"
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Hello,



class ClassAllMembres {

public $_proprietes = array('_TOMembres','_dataOK'); //Je l'ai passé en public comme demandé

public function __construct() {

$this->_TOmembres = array();

$this->_dataOK = $this->chargerAllMembres();

}



oui mais non, lol.

Oublions la classe, voila tres exactement ce que tu fais avec de la programmation...heu..."normale"... :



$tableau = array ('toto', 'tata');



$toto = array ();

$tata = '123';



Et tu crois que $toto et $tableau['toto'] sont la meme chose, mais ce n'est pas le cas!



_TOmembres est un des index de la propriete membre $_proprietes, tu ne peux pas y faire appel comme tu le fais :

$this -> _TOmembres



parce que cette propriete n'existe pas!



ce qui existe par contre :

$this -> _proprietes['_TOmembres']

ca oui.



Tu confonds, etrangement, tableaux et variables, la.