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] Retour de l'objet créé avec parent


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut [POO] Retour de l'objet créé avec parent
    Bonjour,

    J'aimerais savoir, si tout du moins vous en connaissez la cause, pourquoi une variable d'une classe qui a recu le constructeur parent, donc qui selon ma logique devrait retourner un objet, retourne null ?
    Que ce soit à l'intérieur ou à l'extérieur de la classe.

    Un exemple pour comprendre ce que je ne comprends pas
    Code PHP : 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
    class a
    {
        private $a;
        protected function __construct($n)
        {
          $this->a = $n;
        }
    }
     
    class b extends a
    {
        private $b;
        function __construct()
        {
        }
     
        function test($n)
        {
            $b = parent::__construct($n);
            var_dump($b);
            return $b;
        }    
    }
    $b = new b();
    $a = $b->test(10);
    var_dump($a);

    Donc avec ce code, j'obtiens null et null

    Y'a un truc que j'ai pas du saisir.

    Pourquoi le parent::__construct() n'est pas affecté à la variable ?

    Peut-on faire autrement sans en passer par new ?

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    dans la théorie de la POO, un constructeur ne retourne pas de valeur
    pourquoi tu as besoin de ça ? si tu veux créer un objet "a" il suffit de faire ça dans la méthode "test" :

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Merci de ta réponse.

    Le problème si j'utilise new, c'est que je ne pourrais plus accéder à une méthode de la classe enfant.

    Donc il faudrait que j' instancie une nouvelle fois b, et je trouve pas ça top d'instancier une classe dans laquelle je me trouve déjà.

    Enfin, ça me parait un peu bizarre de procéder de cette façon.

  4. #4
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Citation Envoyé par Xunil
    c'est que je ne pourrais plus accéder à une méthode de la classe enfant.
    dans ce cas tu n'as pas besoin de faire des choses compliquées
    essaye ç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
    20
    21
    22
    <?php
     
    class a
    {
        private $n;
     
        function __construct($n)
        {
            $this->n = $n;
        }
    }
     
    class b extends a
    {
        function __construct($n)
        {
            parent::__construct($n);
        }
    }
     
    $b = new b(10);
    var_dump($b);

  5. #5
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    Techniquement la classe B héritant de 1 ne peut accéder qu'aux propriétés/méthodes public ou protected...mais pas au private.
    Such is the situation in our Fallen Galaxy

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    En effet, la proposition de mathieu est correcte. Tu surcharges le constructeur dans ton code, donc tu n'en hérites pas. Pour appeler le constructeur parent malgré la surcharge, il faut l'appeler explicitement à l'aide du mot clef "parent::" dans le constructeur fils

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Merci à tous de vos réponses

    Bon en fait j'en suis passé par une nouvelle instance de la classe parent, et si j'ai vraiment besoin d'une méthode de la classe enfant, ben je la déplacerais dans la classe parent, j'ai pas envie de me compliquer la vie

    En même temps, j'ai une autre question, est-ce possible d'appliquer plusieurs méthodes de suite sans faire à chaque fois
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $truc->f1();
    $truc->f2();
    // etc..

    Donc faire directement (exemple ne fonctionnant pas)

  8. #8
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    la seul solution c'est que la méthode f1 renvoit sa propre classe (un return $this quoi ^^)

    Mais c'est pas forcément pratique pour une méthode...
    Such is the situation in our Fallen Galaxy

  9. #9
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Bien sûr que c'est possible, tout dépend du contexte (tes besoins). Tu as plusieurs exemples ici : http://julien-pauli.developpez.com/t...=zend-db#LIX-F

  10. #10
    Membre expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Points : 3 212
    Points
    3 212
    Par défaut
    oui et non
    C'est possible si tu retournes dans chaque fonction l'instance de ton objet je suppose
    Maintenant c'est pas forcément super propre ^^

    EDIT : j'allais dire que pour des concaténations par exemple (enfin c'est l'idée de la succession des . . ca pouvait etre pratique, ou pour les itérateurs).

  11. #11
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Voilà, oui, c'est justement pour de la concaténation que je voulais faire ça.

    Mais j'ai essayé en faisant un return de mon objet, mais j'ai l'erreur habituelle.

    Exemple de ce que je voudrais faire :
    Code PHP : 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
    class champ
    {
      private $champ;
        function __construct($type, $name, $value)
        {
            $this->champ = '<input type="' . $type . '" name="' . $name . '" value="' . $value . '"';
        }
     
      function longMax($n)
      {
        $this->champ .= ' maxlength="' . $n . '"';
      }
     
      function nbCar($n)
      {
        $this->champ .= ' size="' . $n . '"';
      }
     
      function retour()
      {
        return $this->champ . "/>\n";
      }
    }
     
     
    class form extends champ
    {
      private $champ = array();
      private $form;
      private $fileType = false;
        function __construct($action = URI, $methode='post')
        {
            $this->form = '<form action="' . $action . '" method="' . $methode . '"';
        }
     
      function champText($name, $value='')
      {
        $this->champ[$name] = new champ('text', $name, $value);
        return $this->champ[$name];
      }
     
      function champPasswd($name)
      {
        $this->champ[$name] = new champ('password', $name, $value);
        return $this->champ[$name];
      }
     
      function affichage()
      {
        $this->form .= "/>\n";
        foreach( $this->champ as $name => $obj )
          $this->form .= $this->champ[$name]->retour() ;
        $this->form .= '</form>';
        return $this->form;
      }
    }
     
    $form = new form();
    $pseudo = $form->champText('pseudo');
    $pseudo->longMax(15);
    $pseudo->nbCar(15);
    $passwd = $form->champPasswd('passwd');
     
    echo $form->affichage();

    Donc au lieu de faire $pseudo->methodeX() à chaque fois, je voudrais pouvoir faire tout d'un coup.

  12. #12
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Si je puis me permettre, je pense que tu peux revoir le design

    Ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    class form extends champ
    Est sémantiquement très complexe... Un conteneur qui étend un contenu ?
    Habituellement, les classes spécifiques étendent les classes génériques. Là, tu sembles faire l'inverse, ce n'est pas très naturel et je pense que tu aboutiras rapidement à des incohérences.

    Pour te simplifier la vie, je te recommande de te renseigner sur les frameworks qui proposent déjà ce genre de fonctionnalités, et qui sont déjà très éprouvés

  13. #13
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Merci, mais non, j'ai pas trop envie de me servir de framework.

    Ce que j'ai mit n'était qu'à titre d'exemple, je ne vois pas ce qu'il y de choquant de faire qu'une classe formulaire hérite de tous les attributs pouvant s'y trouver

    C'est même plutôt logique non ?

    Ou alors c'est moi qu'à le cerveau à l'envers.

  14. #14
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Tu viens de le dire toi-même : pour suivre ton raisonnement, ta classe formulaire devrait hériter de chacune des classes que tu peux mettre dedans. Cela suppose de l'héritage multiple, ce qui est impossible en PHP.
    Je pense en effet que tu as pensé cela à l'envers

  15. #15
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Ok, mais si j'inverse la chose, c'est pire non ?

    Une classe champ héritant d'un formulaire aurait encore moins de sens, puisque les méthodes de la classe form ne serait d'aucune utilité dans la classe champ, donc héritage inutile.

    Ou alors, peut-être en faisant une classe form static.

    Oui, c'est vraiment dommage pour l'héritage multiple, en plus leur implémentation future n'est pas au programme.

  16. #16
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Je pense que tu confonds la composition et l'héritage. Il n'y a pas de raison de faire de l'héritage ici, du moins pas avec un relation formulaire/champ.

  17. #17
    Membre averti Avatar de Asmodean
    Profil pro
    Inscrit en
    Février 2006
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 311
    Points : 378
    Points
    378
    Par défaut
    Citation Envoyé par Xunil
    Ok, mais si j'inverse la chose, c'est pire non ?

    Une classe champ héritant d'un formulaire aurait encore moins de sens, puisque les méthodes de la classe form ne serait d'aucune utilité dans la classe champ, donc héritage inutile.

    Ou alors, peut-être en faisant une classe form static.

    Oui, c'est vraiment dommage pour l'héritage multiple, en plus leur implémentation future n'est pas au programme.
    Non ca n'aurait pas moins de sens... c'est même plus logique comme ça. Enfin tout dépend de ce que tu mets dans form.

    Mais l'heritage c'est toujours fait du plus général au plus particulier. Par exemple la classe mère est forme... carré, triangle, cercle en hérite... Puis equilateral, isocele, regulier heritent de triangle etc...

    Donc si ta classe form est une class général concercant les champ, les select ou les input alors tu t'es trompé de sens... Si par contre form est une classe permettant de gérer les <form> et tout ce qui va avec c'est plus de la composition comme l'a dit Yogui.
    Such is the situation in our Fallen Galaxy

Discussions similaires

  1. [POO] Maitriser le codage objet avec PHP 5
    Par cilies38 dans le forum Langage
    Réponses: 3
    Dernier message: 15/06/2010, 08h38
  2. [POO] parcourir un objet json avec une boucle for in
    Par bucheron007 dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 19/01/2009, 12h55
  3. [POO] Objet attendu avec IE
    Par locom dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 08/04/2008, 10h26
  4. [POO] Sérialiser Objet PHP avec Socket
    Par Invité4 dans le forum Langage
    Réponses: 8
    Dernier message: 30/11/2007, 11h37
  5. Réponses: 27
    Dernier message: 03/02/2003, 12h27

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