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] Portée des objets


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 77
    Par défaut [POO] Portée des objets
    Bonjour,
    je coince actuellement sur un soucis au niveau de la portée des objets.

    J'ai un fichier index.php dans le quel j'instancie un objet de la classe A et un objet de la classe B:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $a = new A();
    $b = new B();
    Dans ma classe B, j'aimerai bien avoir accès à l'objet $a :
    class B {
    function B() {
    $a->getVar();
    }
    }
    Cependant cela ne marche pas (je m'en doutais un peu). Maintenant le problème est de trouver un moyen pour pouvoir accèder à cet objet $a instancié dans le même fichier que l'objet $b, dans la classe B.

    À part utiliser le mot clé "global" que je serai contraint de rédéclarer dans chaque méthode utilisant l'objet $a, n'y a-t-il pas une autre solution ?

    Parce que certe là ça ne semble pas être très important, mais en réalité j'ai pleins d'objets auxquels je voudrai accéder dans pleins de classes et dans pleins de méthodes. Utiliser le mot clé global à chaque fois est assez génant pour moi.
    N'y a-t-il pas une autre solution ?

    Sinon je peux faire de index.php une classe Index avec deux attributs $this->a (l'objet $a) et $this->b (...) et je fais hériter toute mes classes de Index, et donc je pourrai accéder dans toutes mes classes à mes deux objets comme ça : $this->a->getVar(); par exemple.
    Cette solution est elle meilleure ?
    Cependant elle m'oblige quand même à : 1) employer $this à chaque fois, et 2) à faire hériter toute mes classes de Index.

    Y a t il une solution qui m'aurait échappée ?

    Merci d'avance pour vos réponses.


    PS : sinon il y a la solution d'utiliser le tableau $GLOBALS et de mapper chaque valeur dans une variable, genre $a = $GLOBALS['a'] mais bof bof.

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Ben tu as la première : le mot clé global partout dans les méthodes. Effectivement ca n'est pas génial et puis il faut s'assurer que la variable est vraiment déclarée partout etc, ca peut poser des problèmes.

    Ensuite tu as la solution de passer cette instance de classe en paramètre de chaque méthode. C'est plus clair parce que tu vois le paramètre, quand tu appelles la fonction tu SAIS que tu as besoin de cette autre classe, qu'elles est instanciée vu que tu la passes en paramètre. Mais ca peut etre ennuyeux si t'as 200 méthodes et trois classes utilisées dans chaque méthode.

    Tu peux aussi passer cette instance (de la classe A) au constructeur de la classe B. Comme ca tu ne le passes qu'une fois en paramètre, lors du constructeur, et donc ta classe B contient une "instance de la classe A" dans ses variables.

    Et puis il y a effectivement la solution de faire une classe supérieure qui se charge de contenir une instance de chacune de tes classes indispensables.

    Perso je pencherai pour la solution du constructeur dans la majorité des cas mais parfois ca n'est pas adapté.

  3. #3
    Membre extrêmement actif
    Avatar de stailer
    Homme Profil pro
    Architecte technique
    Inscrit en
    Mars 2003
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Hautes Pyrénées (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 144
    Billets dans le blog
    3
    Par défaut
    Il ne faudrait pas passer plutôt par un multition ou un truc du genre :

    function B()
    {
    $inst = A::getInstance();

    $mavar = $inst->getVar();
    }


    Je dis ça un peu à l'arrache, voir le cours sur ce site concernant les multitons

  4. #4
    Membre éprouvé
    Inscrit en
    Mai 2002
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 101
    Par défaut
    Effectivement, le plus clair me semble de passer une instance de A au constructeur de B.

    Le global, ça devient vite le souk (et c'est pas propre). Ca peut se justifier si tu as des dépendances croisées (genre A utilise B et B utilise A), encore que...

    Le passage en paramètre, ça fonctionne bien pour un appel ou deux, mais si tu as toujours besoin de A, ça peut vite devenir lourd à implémenter

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 3
    Par défaut
    Sur le coup, je pensais comme koopajah, passer l'instance de A au constructeur de la classe B. Mais a ce moment la est ce que cela crée un pointeur vers l'instance A dans B, ou est ce que cela créer une autre instance de A propre a B ?

    Sans compter que si on veux faire l'invers (utiliser B das A) cette solution n'est pas valable étant donner qu'il faudra bien en instancier un avant l'autre ^^.

  6. #6
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Tu passes ce qu'on appelle une référence, tu ne crées pas une nouvelle instance.

    Et j'ai du mal a me rappeler d'un cas ou deux classes ont besoin mutuellement l'une de l'autre.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 87
    Par défaut
    salut,

    tu peux aussi utilisez un registre (registry). Pas mal utiliser dans les frameworks. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class A { function getVar() {} ... }
     
    Registry::register('a', new A());
     
    class B {
    function getVar() {
    Registry::get('a')->getVar();
    }
    }
    en fait Registry est une classz "statique" dans lequel tu peux enregistrer des instances de classes et les nommer. Tu peux ensuite accéder à ces instances en utilisant leur nom.

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

Discussions similaires

  1. POO -> principe de création des objets
    Par DeeVoiD dans le forum Langage
    Réponses: 5
    Dernier message: 20/11/2009, 09h24
  2. [POO] Récupérer des objets en PHP 4
    Par slyfer dans le forum Langage
    Réponses: 4
    Dernier message: 01/02/2007, 10h22
  3. [POO] PB d'interprétation des '\n' (PHP Objet)
    Par Bobabar dans le forum Langage
    Réponses: 8
    Dernier message: 25/04/2006, 01h08
  4. [FLASH 8] Question sur la portée des objets.
    Par i_shinji dans le forum Flash
    Réponses: 1
    Dernier message: 02/11/2005, 17h18
  5. Réponses: 3
    Dernier message: 17/10/2005, 16h26

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