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] instance et portée


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par défaut [POO] instance et portée
    Bonjour, j'ai qq questions qui me taraudent depuis 2 jours et j'ai beau cherché chez mon ami google, je ne trouve pas de réponse à mes questions.

    1ere colle

    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
     
    class a {
     
       public $test='a';
     
    }
     
    class b extend a {
     
       public function view() {
       [....]
       }
     
    }
     
    $a = new a;
    quand une classe A est etendu avec une B, si on fait une instance de A, il y a une possibilité d'accéder aux methodes de B?

    et a l'inverse dans B est-il possible de modifier $a->test sans passé par un global $a (bien degeux d'ailleur).

    Vu que je pense qu'il n'y a pas de solution sans instantié B, je me suis dit que dans A je pouvais include_once la class B est l'instancié a l'interieur de A.

    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 a {
     
       public $test='a';
       public $b;
     
       public function load($class){
     
          include_once('classB.php');
          $this->b = new b;
     
       }
     
    }
     
    $test = new a;
    $test->load(b);
     
    $test->b->view();
    Du coup j'accède bien (la classe B n'est d'ailleurs plus une extend) à la méthode view de ma classe B. Mais voila le problème c'est que j'aimerais bien modifier $test->test depuis B. Le seul moyen que j'ai trouvé c'est de passer $test en global (cado bis).

    Pour résumé, j'essaye d'ajouter des methodes à une classe déjà instancié mais je sais pas si c'est possible (desolé noob inside en POO).

    2eme colle :
    Si je fais un include dans une classe d'un autre fichier classe, comment rendre la "classe incluse" disponible de partout dans l'application.

    Merci d'avance des réponses éventuelle

  2. #2
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Bonsoir,
    Citation Envoyé par kaen25 Voir le message
    1ere colle
    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
     
    class a {
     
       public $test='a';
     
    }
     
    class b extend a {
     
       public function view() {
       [....]
       }
     
    }
     
    $a = new a;
    quand une classe A est etendu avec une B, si on fait une instance de A, il y a une possibilité d'accéder aux methodes de B?
    C'est la classe B qui est étendu avec la classe A (B hérites de A). Lorsque tu instancies B tu pourras accéder aux méthodes de A (la classe parente). Evidemment ca ne marche pas dans le sens inverse.
    Pour résumé, j'essaye d'ajouter des methodes à une classe déjà instancié mais je sais pas si c'est possible (desolé noob inside en POO).
    Pas possible.
    2eme colle :
    Si je fais un include dans une classe d'un autre fichier classe, comment rendre la "classe incluse" disponible de partout dans l'application.
    Tu peux directement inclure le fichier de la classe incluse dans ton application ?
    j'aimerais bien modifier $test->test depuis B.
    Dans la classe B tu peux manipuler le membre $test avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $this->test = 5;
    // Ou créér une méthode setTest dans A
    parent::setTest($val);

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par défaut
    Merci pour la réponse.

    Pour expliquer plus clairement :
    J'ai une classe principale qui est instancié auquel je voudrais greffer tout un tas de methode via d'autre classe en continuant d'utiliser 1 seule instance.
    Je fais ca dans le but de me trimbaler qu'un seul objet extensible en cours de route avec d'autres classes pour pouvoir découper mon code en sous catégorie.

    exemple:
    $core->html->input->add(......) (ce qui aura pour effet de m'ajouter un champ input dans la page courante pour résumé).

    Mais j'ai du mal a voir comment c'est possible.

    J'ai vu que dans zend ils passe par un autoload mais j'ai pas bien compris le principe.

  4. #4
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    J'ai une classe principale qui est instancié auquel je voudrais greffer tout un tas de methode via d'autre classe en continuant d'utiliser 1 seule instance.
    Il suffit que ta classe principale possède des membres de différentes classes. En reprenant ton exemple, tu aurais:

    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 Input {
      public function add(..) { .. }
    }
    class Html {
      public $input;
      public function __construct() {
        $this->input = new Input;
      }
    }
    class Core {
      public $html;
      public function __construct() {
        $this->html = new Html;
      }
    }
     
    $core = new Core;
    $core->html->input->add(..)
    Aussi, php autorise l'ajout de propriétés membres (donc pas des méthodes ou fonctions si php < 5.3) lors de l'éxécution. Donc si tu as une autre class Dummy par exemple, tu peux faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $core->dummy = new Dummy;
    $core->dummy->blah()
    Cela sans que $dummy soit déclaré dans la classe Core.

    A part ça il est généralement déconseillé d'avoir une instance "fourre tout" dans une application car sémantiquement parlant, on ne sait plus trop quoi fait l'objet.

    J'ai vu que dans zend ils passe par un autoload mais j'ai pas bien compris le principe.
    Ca c'est un autre sujet. __autoload() permet de charger des classes comme on pourrait le faire manuellement avec require_once(). C'est utile pour des questions de performances mais surtout quand on ne sait pas par avance de quelles classes on va avoir besoins.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par défaut
    Merci bcp pour la reponse.

    En fait j'ai trouvé par moi même une solution.
    Mais grâce à cette réponse je pense que ce que j'ai fais est pas trop dégueulasse.

    En gros ma classe principale est un singleton.
    Dans le singleton j'ai mon chargement dynamique ou j'instancie la classe include.
    Dans la classe incluse je rappelle la classe singleton que je récupère via un maclasse::getIntance().

    J'avais juste une dernière question si je fais un var_dump de mon objet je tombe sur une valeur *recusive* sur la variable qui stocke mon getIntance c'est grave doc?

    Apres je pense que ce sera bon.

    Si j'inclus d'autre classe c'est juste pour que mon fichier principal soit le plus leger possible. Mais au final il n'y aura pas des masses de classe "load" a l'interieur.

  6. #6
    Membre chevronné Avatar de goodpz
    Profil pro
    Inscrit en
    Février 2007
    Messages
    475
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 475
    Par défaut
    J'avais juste une dernière question si je fais un var_dump de mon objet je tombe sur une valeur *recusive* sur la variable qui stocke mon getIntance c'est grave doc?
    Non ce n'est pas grave. C'est fréquent que 2 objets aient des références mutuelles l'un vers l'autre.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 30
    Par défaut
    En tout cas merci pour toute ses réponses.

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

Discussions similaires

  1. [POO] Variable et portée.
    Par Evilam dans le forum Langage
    Réponses: 7
    Dernier message: 15/05/2009, 13h38
  2. [POO] Limiter la portée d'une variable
    Par j0o0 dans le forum Langage
    Réponses: 1
    Dernier message: 04/11/2007, 21h05
  3. [POO] instances de classe
    Par benkunz dans le forum Langage
    Réponses: 1
    Dernier message: 27/03/2007, 21h58
  4. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  5. instance et port
    Par Magohamoths dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 16/09/2005, 09h31

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