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 :

[POO] accéder aux méthodes d'un objet attribut d'un autre objet


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut [POO] accéder aux méthodes d'un objet attribut d'un autre objet
    Bonjour,
    je débute dans la POO, j'ai lu plusieurs cours dessus mais aucun ne va assez loin pour m'apporter une réponse à ce qui me préoccupe :

    Exemple :
    3 objets A,B et C
    L'objet C est un attribut de l'objet B qui est un attribut de l'objet A.

    Comment puis-je accéder aux méthodes de l'objet C pour le modifier à l'intérieur de l'objet A de façon "sécurisée" ?

    Est-ce que je dois recréer dans l'objet B des méthodes qui appellent les méthodes de l'objet C, et recréer ces mêmes méthodes dans l'objet A ?
    Ex:

    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
    //Dans A :
    function methode_acces_a_C()
    {
    $this->attribut_B->methode_acces_a_C();
    }
     
    //Dans B :
    function methode_acces_a_C()
    {
    $this->attribut_C->methode_de_C();
    }
     
    //pour pouvoir écrire :
    $objet_A=new A();
    $objet_A->methode_acces_a_C();
    Ou est-ce que j'ai le droit d'écrire directement ceci (dans un script) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    objet_A->objet_B->objet_C->methode_de_l_objet_C();
    La première méthode me paraît très lourde, la seconde me paraît "risquée"

    Je précise que je travaille en PHP4, mais que la question restera valable pour PHP5.

    J'espère avoir été clair.
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de viviboss
    Profil pro
    Inscrit en
    Août 2006
    Messages
    943
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Août 2006
    Messages : 943
    Points : 1 248
    Points
    1 248
    Par défaut
    Hum....
    L'objet en PHP5 est plus évolué qu'en PHP4, donc tu devrais cache passé en version 5, à moins que tu ai des contraintes dues aux versions....

    Sinon, pour ton PB en fait c'est un PB d'encapsulation de tes Objets..... (PS : un objet n'est pas un attribut d'un autre objet....)

    En fait, ton objet B hérite de A, et C de B.... Donc en PHP 5 tu as 3 cas : des méthodes ou variables Public, Private ou Final.

    PUBLIC est accéssible via n'importe ou (instanciation de l'objet ou bien accès par un autre objet)

    Private limite l'accès à l'intérieur de l'objet lui-même,

    Et enfin Final permet une utilisation entre objet hérités (ainsi, de ton objet C tu peut accéder aux méthodes de l'objet A, mais uniquement de cette manière, tu ne peux pas utiliser une méthode Final en instanciation directe)

    Moi, ce que je fais pour avoir accès à une méthode que je dois "sécuriser", c'est comme 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
     
    class machin{
     
    //Cette méthode n'est pas utilisable en dehors de la classe
    private function truc{
    //instructions.....
    }
     
    //Là, on ne montre à l'extérieure de la classe QUE le résultat de truc, sans possibilité de voir autre  chose que le résultat...
    public function autre{
    return $this->truc;
    }
     
    }
    (Hummm.... Si quelqu'un voit une meilleure méthode, je suis preneur... )

    Ensuite, ba l'héritage marche de la même manière qui si c'était une énorme classe composé de méthode (j'espère ne pas dire d'énormité, pardonnez moi d'avance, c'est la seule image qui me vienne !!!!

    Ainsi, on accèdera aux méthodes d'un objet parent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    parent::méthode();
    Mais bien entendu, c'est en php5, je sais qu'il y a beaucoupde différence entre PHP4 et 5 en ce qui concerne l'Objet....

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse, mais je crois que tu ne m'as pas compris.
    C'est parce que je me suis mal exprimé :
    Les objets B et C sont en fait des instanciations de classes différentes.
    L'objet A pourrait être un bus, l'objet B un passager du bus, et l'objet C un numéro de téléphone de passager.

    Si je veux modifier le numéro de téléphone d'un passager du bus depuis le bus, comment faire ?
    Est que je dois créer une méthode dans la classe bus :
    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
    function modifie_numero_d_un_passager($numero)
    {
    $this->passager->modifie_numero($numero);
    }
     
    et dans la classe passager :
    function modifier_numero($numero)
    {
    $this->telephone->change_numero($numero);
    }
     
    et dans la classe telephone :
    function change_numero($numero)
    {
    $this->numero=$numero;
    }
    Voili voilou...

  4. #4
    Membre actif
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2006
    Messages
    215
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2006
    Messages : 215
    Points : 256
    Points
    256
    Par défaut
    salut

    si j'ai bien compris, ta deuxième solution est la bonne

    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
     
    <?php
    class Bus
    {
    	private $dicoPassager; // contien des objet passager
     
    	public function getPassagerByClef ($clef)
    	{
    		return $this->dicoPassager[$clef];
    	}
    }
     
    class Passager
    {
    	private $obj_tel;
     
    	public function getTelephone ()
    	{
    		return $this->telphone;
    	}
    }
     
    class Telephone
    {
    	private $num_tel;
     
    	public function modifie_telephone ($newTel)
    	{
    		$this->num_tel = $newTel;
    	}
    }
     
    ///
    $bus = new Bus ();
     
    //
    $obj_passager_1 = $bus->getPassagerByClef ('passager_1');
    $obj_telphone_passager_1 = $obj_passager_1->getTelephone ();
    $obj_telphone_passager_1->modifie_telephone (01444558);
    // ou
    $bus->getPassagerByClef ('passager_1')->getTelephone ()->modifie_telephone (01444558);
    ?>
    enfin je vois le truc comme ca

    sahid

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 15
    Points : 6
    Points
    6
    Par défaut
    Merci pour ta réponse Sahid,
    je pense que ça peut marcher en php5, mais pour obtenir le même résultat en php4, il faut que j'arrive à faire des passages par référence.
    J'ai essayé mais je n'ai pas réussi.
    Par exemple dans ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $obj_passager_1 = $bus->getPassagerByClef ('passager_1');
    $obj_telphone_passager_1 = $obj_passager_1->getTelephone ();
    $obj_telphone_passager_1->modifie_telephone (01444558);
    En php5, si on modifie $obj_passager_1, on modifie bien le passager dans le bus, en revanche si on fait cela en php4, on modifie une copie du passager, mais pas le passager voulu.
    J'ai essayé de copier par référence en php4, avec ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Bus
    {
    	var $dicoPassager; // contien des objet passager
    	
    	function getPassagerByClef ($clef)
    	{
    		return &$this->dicoPassager[$clef];
    	}
    }
    Cela renvoie une erreur.
    Donc je suis toujours coincé avec le php4 (pour des raisons de maintenance)

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/05/2010, 17h59
  2. Comment accéder aux méthodes d'un objet hors de la classe ?
    Par floating_inkpot dans le forum Windows Forms
    Réponses: 0
    Dernier message: 18/04/2010, 21h26
  3. Réponses: 1
    Dernier message: 02/11/2009, 18h46
  4. Accéder aux méthodes d'objets alloués dynamiquement
    Par Galip dans le forum C++Builder
    Réponses: 5
    Dernier message: 21/05/2007, 22h57
  5. Réponses: 5
    Dernier message: 23/04/2007, 16h31

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