IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

parcourir les objets d'une classe


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut parcourir les objets d'une classe
    Bonjour,

    Je débute en PHP objet, j'effectue déjà du developpement objet en vb.net alors je sais pas forcement si l'utilisation et les fonctionnalités sont les même. Les cours expliquent bien pour s'initier mais j'ai du mal à trouver pour l'utilisation des classes et les fonctions couramment utilisées.
    (s'il y a des cours ou tutos pour aller un peu plus loin en POO je suis preneuse !)

    Pour l'instant j'ai besoin d'une fonction qui parcoure une classe afin de rechercher un objet particulier, j'utilise beaucoup ce genre de fonctions de parcours de classe dans la classe en question.

    De plus, j'ai dans mon application des utilisateurs et des services, et un tableau d'utilisateurs pour chaque service. Je souhaiterais que mon constructeur d'utilisateurs ajoutent l'objet utilisateur en création dans le tableau.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Utilisateur
    {
    var $uti_id;
    var $uti_nom;
    var $uti_pass;
    var $uti_mail;
    var $uti_serv;
     
    function Utilisateur($id, $nom, $pass, $mail, $serv_id){
    $this->uti_id=$id;
    $this->uti_nom=$nom;
    $this->uti_pass=$pass;
    $this->uti_mail=$mail;
    $this->uti_serv=? ;//recherche de l'objet service correspondant à l'identifiant du service
     
    //ajout de l'utilisateur dans la liste des utilisateurs du service
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Service
    {
    var $serv_id;
    var $serv_abr;
    var $serv_lib;
    var $serv_uti;
     
    function Service($id, $abr, $lib){
    $this->serv_id=$id;
    $this->serv_abr=$abr;
    $this->serv_lib=$lib;
    }
    }

    Merci d'avance pour toute aide.

  2. #2
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Bonjour,

    je vois deux possibilités.

    soit tu passes l'objet service par référence et ton constructeur de utilisateur deviens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    function Utilisateur($id, $nom, $pass, $mail, &$serv){
      $this->uti_id=$id;
      $this->uti_nom=$nom;
      $this->uti_pass=$pass;
      $this->uti_mail=$mail;
      $this->uti_serv=$serv;
      $serv->serv_lib[] = $this;
    }
    ou alors tu demandes a ta classe service, d'ajouter de créer un utilisateur. Et tu ajoutes l'utilisateur pour completer ton service.
    Avec quelque chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
     function addnewUser($params)
     {
       $this->serv_lib[] = new Utilisateur($params)
     
     }
    Tout énigme a une solution ! Tout est question de discipline !

  3. #3
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci je te dirais si cela marche !

    Mais j'ai tout de même du mal à trouver une fonction qui parcours tout les objets d'une classe par un foreach par exemple

  4. #4
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    Regardes cette discussion sur ce POST ici et prends comme exemple le développement de la class:
    class Participants implements Iterator
    Cette class utilise ce que tu souhaites.
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  5. #5
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Merci beaucoup c'est tout à fait ce dont j'avais besoin pour parcourir mes classes !

    Mon problème était de vouloir programmer comme en vb.net, et de ne donc pas passer par un tableau.

  6. #6
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Par rapport à ce post, j'ai donc essayé cette solution qui ne fonctionne pas

    mes deux classes Droit et Utilisateur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Utilisateur
    {
    //variables locales
    var $uti_id;
    var $uti_nom;
    var $uti_pass;
    var $uti_mail;
    var $uti_droi;
     
    //constructeur
    function __construct($id, $nom, $pass, $mail, $droi){
    $this->uti_id=$id;
    $this->uti_nom=$nom;
    $this->uti_pass=$pass;
    $this->uti_mail=$mail;
    $this->uti_droi=$droi;
    si::new_utilisateur($this);
    }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Droit
    {
    //variables locales
    var $droi_id;
    var $droi_lib;
     
    //constructeur
    function __construct($id, $lib){
    $this->droi_id=$id;
    $this->droi_lib=$lib;
    si::new_droit($this);
    }
    }
    La classe qui contient les tableaux des objets des autres classes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    class SI
    {
    var $droits;
    var $utilisateurs;
     
    function __construct{
    $this->droits = array();
    $this->utilisateurs = array();
    }
     
    function new_utilisateur($uti){
    $this->utilisateurs[$uti->uti_id] = $uti;}
     
    function new_droit($droi){
    $this->droits[$droi->droi_id] = $droi;}
     
    function montrer_droit(){
    foreach($this->droits as $droit)
    {
                echo $droit->droi_id;
        }
    }
    }
    suite du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $si = new SI;
     
    $droi=new Droit(1, "admin");
    $droi=new Droit(2,"consult");
    $uti=new Utilisateur(1,"albert","alb","albert@...",2);
    $uti=new Utilisateur(2,"didier","did","didier@...",1);
     
    $si->montrer_droit();
    Peut etre une erreur dans l'appel de la fonction new_laclasse dans le constructeur de la classe ?

    sinon je ne vois pas je suis assez perdue !

  7. #7
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Bonjour, ton objet Si ne connait pas les droits et les utilisateurs :

    pour ca tu dois utiliser tes fonctions "new_droit" et "new_utilisateur" avec les bons objets pour que ta boucle affiche quelque chose.
    Tout énigme a une solution ! Tout est question de discipline !

  8. #8
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    C'est à dire ? Je comprend peut être où tu veux en venir mais ne vois pas du tout comment et où resoudre le problème !

    Ce que je ne comprend pas est que si j'enlève dans les autres classes et mon code tout ce qui concerne la classe SI, mais que je garde la classe, plus rien ne marche !
    Même un simple "echo "a"" de test dans le code n'affiche rien.

  9. #9
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Citation Envoyé par Yukiho Voir le message
    C'est à dire ? Je comprend peut être où tu veux en venir mais ne vois pas du tout comment et où resoudre le problème !
    Ta classe SI dans sa méthode montrer_droit affiche tout le contenu de sa variable. Or a aucun moment tu renseignes cette variable. D'apres ta classe tu dois utiliser la fonction "new_droit".

    Grosso modo ton dernier bout de code deviendrait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    $si = new SI;
     
    $droi=new Droit(1, "admin");
    $si->new_droit($droi);
    $droi=new Droit(2,"consult");
    $si->new_droit($droi);
     
    $uti=new Utilisateur(1,"albert","alb","albert@...",2);
    $si->new_utilisateur($uti);
    $uti=new Utilisateur(2,"didier","did","didier@...",1);
    $si->new_utilisateur($uti);
     
    $si->montrer_droit();
    La différence entre ton code et le mien et qu'a chaque création d'un utilisateur, je dis à l'objet SI que celui existe. En plus vu que tu réutilise les mêmes variables, tu gardes uniquement les informations sur la dernière instance créée.


    Apres pour la comparaison avec VB.net, cela fait longtemps que je n'y ai pas retouché, donc sur ce point j'aurais un peu de mal à t'aider.
    Tout énigme a une solution ! Tout est question de discipline !

  10. #10
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    A une instance de Utilisateur ou Droit comment veut tu que le Si soit connu par tes deux lignes:
    si::new_utilisateur($this);

    OU

    si::new_droit($this);

    Ou alors j'ai pas la même syntaxe dans la tête (je viens pas non plus du Php à la base).

    Ensuite comme le dit 'Bebel', il faut que tu utilises tes fonctions d'insertion dans les tableaux: new_utilisateur() ou new_droit() ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  11. #11
    Membre éprouvé Avatar de Bebel
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2003
    Messages : 786
    Points : 1 262
    Points
    1 262
    Par défaut
    Sinon une autre idée tu ajoutes un singleton dans ta classe SI.
    Ton code va ressembler à ca.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    class Utilisateur
    {
    	//variables locales
    	var $uti_id;
    	var $uti_nom;
    	var $uti_pass;
    	var $uti_mail;
    	var $uti_droi;
     
    	//constructeur
    	function __construct($id, $nom, $pass, $mail, $droi){
    	$this->uti_id=$id;
    	$this->uti_nom=$nom;
    	$this->uti_pass=$pass;
    	$this->uti_mail=$mail;
    	$this->uti_droi=$droi;
    	si::getInstance()->new_utilisateur($this);
    	}
    }
     
    class Droit
    {
    	//variables locales
    	var $droi_id;
    	var $droi_lib;
     
    	//constructeur
    	function __construct($id, $lib){
    	$this->droi_id=$id;
    	$this->droi_lib=$lib;
    	si::getInstance()->new_droit($this);
    	}
    }
     
    class SI
    {
    	private $droits;
    	private $utilisateurs;
    	private static $instance = null;
     
    	function __construct() {
    		$this->droits = array();
    		$this->utilisateurs = array();
    	}
     
    	public function getInstance()
    	{
    		if (self::$instance === null)
    		{
    			// on crée le singleton
    			self::$instance = new SI();
    		}
    		return self::$instance;
    	}
     
    	function new_utilisateur($uti){
    	$this->utilisateurs[$uti->uti_id] = $uti;}
     
    	function new_droit($droi){
    	$this->droits[$droi->droi_id] = $droi;}
     
    	function montrer_droit(){
    	foreach($this->droits as $droit)
    	{
    	            echo $droit->droi_id;
    	    }
    	}
    }
     
    $si = new SI;
     
    $droi=new Droit(1, "admin");
    $droi=new Droit(2,"consult");
    $uti=new Utilisateur(1,"albert","alb","albert@...",2);
    $uti=new Utilisateur(2,"didier","did","didier@...",1);
     
    $si->montrer_droit();
    Tout énigme a une solution ! Tout est question de discipline !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Pas simple à expliquer ton affaire...

    Dans les constructeurs de tes classes Utilisateur et Droit, tu fais un appel statique aux méthodes de SI (d'ailleurs ta classe s'appelle 'SI', pas 'si', c'est pas grave, PHP tolère, mais c'est caca)
    Le problème c'est que les méthodes déclarées dans SI ne sont pas faites pour répondre à un appel statique (tu devrais afficher les E_NOTICE et E_STRICT, ça aide pour développer et débuguer)

    Tu as plusieurs solutions :
    - passer ton instance de SI en paramètre des constructeurs.
    - ajouter les instances de Droit et Utilisateur que tu crées à ton instance de SI au niveau procédural
    - revoir ta classe SI pour en faire un singleton.
    - donner une visibilité globale à ton instance de SI...

    T'as le choix ! Perso j'opterais pour la 1 ou la 2, mais chacun fait comme il veut
    Pourfendeur de singletons en croisade

  13. #13
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Dites moi donc aujourd'huis c pas mon jour

    Pas un bon W.E, de la fatigue dans les neurones, bref je retourne à mon tricot

    Bon alléééé, fait beau aujourd'hui, j'vais mettre mes raquettes et faire un tour dans la peuf, ya encore de la neige ...
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  14. #14
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Youpi !!

    L'astuce de passer le SI en paramètre des constructeurs est super efficace !

    Merci beaucoup ...

    On verra bien si les prochaines utilisations seront concluantes !

  15. #15
    Membre à l'essai
    Profil pro
    Étudiant
    Inscrit en
    Mars 2010
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2010
    Messages : 28
    Points : 15
    Points
    15
    Par défaut
    Bon je n'arrive pas ensuite à re-utiliser ça pour autre chose

    Je crois que je vais arréter ce projet vu que je ne peux le réaliser seule

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir les propriétés d'une classe
    Par eagleleader dans le forum ASP.NET
    Réponses: 11
    Dernier message: 07/10/2008, 14h06
  2. Parcourir les éléments d'une classe
    Par rvhp2 dans le forum Langage
    Réponses: 10
    Dernier message: 01/10/2008, 19h06
  3. [VB.NET 2005] Parcourir les propriétes d'une Class
    Par ricil78 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 27/03/2007, 21h47
  4. Parcourir les membres d'une classe
    Par oodini dans le forum C++
    Réponses: 4
    Dernier message: 20/10/2006, 22h59
  5. [VB.NET] Parcourir les attributs d'une classe
    Par pasqwal dans le forum Windows Forms
    Réponses: 3
    Dernier message: 15/02/2005, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo