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] Héritage : Surcharge d'un membre statique parent


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 58
    Points : 30
    Points
    30
    Par défaut [POO] Héritage : Surcharge d'un membre statique parent
    Bonjour à tous ! J'ai un petit soucis dont je n'arrive pas à dénicher d'infos suffisantes pour m'aider. Je me demande même si c'est réellement possible...

    J'ai deux classes : C1 et C2 qui hérite de C1
    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 C1
    {
    	static $member = "defaut";
     
    	function print_member()
    	{
    		echo self::$member."<br />";
    	}
    }
     
    class C2 extends C1
    {
    	static $member;
     
    	// Pleins de trucs sympas ^^
    }
    Mon soucis est le suivant : en fait j'ai une multitude de classes type C2 et je voudrais qu'elles aient chacune leur version de la valeur de $member qui est statique. Seulement si dans mon code je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    C2::$member = "youpi";
    $c2 = new C2();
    $c2->print_member();
    C'est "defaut" qui est affiché et non "youpi" : il n'y a pas surcharge du membre statique à travers la fonction. Si je retire la ligne "static $member;" dans C2, alors à chaque nouvelle affectation de $member, toutes les classes filles de C1 auront le même membre.
    Mon but c'est justement que la fonction soit la même pour tous mais qu'elle fasse intervenir le membre statique de chacun.

    Pour la petite histoire, ce que je compte faire c'est affecter un nom de table MySQL à ce membre statique et créer des fonctions plutôt complexes utilisant ce membre dans les requêtes. Le but ultime étant bien évidemment de ne pas recopier chaque fonction de C1 dans chaque classe C2 et de garder le fait que ce membre soit statique (ainsi le nom de la table est commun à chaque objet de même classe C2).

    Comment pouvoir surcharger un membre statique d'une classe mère et l'utiliser dans les fonctions non surchargées ? Est-ce possible en PHP5 ?

    Merci de votre aide, et désolé si le sujet est déjà passé ; j'ai eu beau cherché j'ai pas trouvé mon bonheur !

  2. #2
    Membre régulier Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Points : 88
    Points
    88
    Par défaut
    Ce que tu veux faire dans ton code n'est pas possible. La seule solution si tu veux a tout prix garder ta variable statique, est de mettre la methode print_membre dans tes classes type C2. Mais apparemment tu ne veux pas ca.

    Mais a la lecture de ton probleme, je ne comprends pas pourquoi tu veux a tout prix garder cette propriete statique. Un code comme cela ne te convient il pas ? >
    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
    <?php
     
    class C1
    {
        private $member = "defaut";
     
        public function print_member()
        {
    	echo $this->member . "<br />";
        }
     
        public function setMember($newValue)
        {
            $this->member = $newValue;
        }
    }
     
    class C2 extends C1
    {
        // Pleins de trucs sympas ^^
    }
     
    $c2 = new C2();
    $c2->setMember('foo');
    $c2->print_member();
     
    ?>
    Tu peux egalement te passer de setMember en utilisant public au lieu de private dans la definition de $member. ?
    Pas de question techniques par MP

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 58
    Points : 30
    Points
    30
    Par défaut
    Ok merci donc de ta confirmation, ne trouvant pas d'infos sur le net j'en avais pratiquement déduis que ce n'était pas possible. Le full object en PHP n'est pour l'instant qu'une utopie ...

    Mais a la lecture de ton probleme, je ne comprends pas pourquoi tu veux a tout prix garder cette propriete statique. Un code comme cela ne te convient il pas ?
    Si si bien sûr que ça me convient ; c'est juste que ce n'est pas pratique d'affecter cette variable membre à chaque création d'objet de même classe C2 si sa valeur sera la même pour toutes les instances de C2. D'ou l'utilisation d'une variable statique pour affecter ce membre une seule fois pour toute.

    Mon but était de trouver le moyen de factoriser au maximum mon code et éliminer quelques lignes superflues. Du coup, je pense être sur la bonne voie en dénichant un équivalent à utiliser une variable statique :

    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 C1
    {
    	protected $parent_member;
     
    	function print_member()
    	{
    		echo $this->parent_member."<br />";
    	}
    }
    class C2 extends C1
    {		
    	static $member;
     
    	function __construct()
    	{
    		$this->parent_member = C2::$member;
    	}
    }
    Ca fonctionne mais... est-ce la meilleure idée ?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Points : 910
    Points
    910
    Par défaut
    Salut,

    Par rapport à ce que tu veux faire, voici un exemple qui me parait convenir :

    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
    abstract class AbstractTable {
      abstract function getTableName();
     
      function requeteBidule()
      {
        return sprintf("SELECT * FROM %s", $this->getTableName());
      }
    }
     
    class TableBidule extends AbstractTable {
      function getTableName() { return "bidule"; }
    }
     
     
    $bidule = new TableBidule();
     
    echo $bidule->requeteBidule();
    Bien sur, ta méthode avec un membre peut aussi fonctionner. Mais les classes abstraites sont faites spécialement pour ça : définir "partiellement" des classes et forcer les implémentations (classes filles) à définir certaines fonctions.
    D'ailleurs, le compilateur générera une erreur si on implémente pas getTableName() dans une classe fille :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class TableMachin extends AbstractTable {
    }
     
    -> Fatal error: Class TableMachin contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (AbstractTable::getTableName)
    Toute la documentation Ruby on Rails : gotapi.com/rubyrails
    Mes articles :
    > HAML : langage de template pour Ruby on Rails

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mai 2006
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 206
    Points : 319
    Points
    319
    Par défaut
    En fait il est possible de surcharger les membres et méthodes en PHP5 à l'aide des méthodes magique __set et __get, on peut aussi s'aider des méthodes magiques __isset et __unset, essaye de regarder ici :
    http://www.php.net/manual/fr/languag...verloading.php

    J'ai essayer de comprendre mais il se fait tard la j'ai pas fini mon exemple :s je reviens demain si tu as toujours pas trouver mais cela doit être faisable.

  6. #6
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Les methodes magiques ne sont executées qui si la méthode ou la propriété appelé n'est pas publique.
    Par contre, si changer la valeur par défaut est votre seul problême, vous n'avez qu'a la changer dans le contructeur de la classe enfant après avoir éxécuté le contructeur parent.
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  7. #7
    Nouveau membre du Club
    Inscrit en
    Mars 2005
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 58
    Points : 30
    Points
    30
    Par défaut
    Citation Envoyé par is_null Voir le message
    si changer la valeur par défaut est votre seul problême, vous n'avez qu'a la changer dans le contructeur de la classe enfant après avoir éxécuté le contructeur parent.
    J'avais effectivement aboutit à cette conclusion ; je trouve pas ça pas pratique à 100% mais c'est apparemment la meilleure solution.

    Merci à tous pour l'aide !

  8. #8
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    En quoi n'est-ce-pas 100% pratique ?
    Si vous voulez, j'ai une classe qui moud le cafe et une autre qui fait bouillir de l'eau
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 12/03/2013, 13h23
  2. Réponses: 3
    Dernier message: 25/04/2012, 16h53
  3. [PHP 5.0] [POO] Héritages de variables statiques
    Par LogistiX dans le forum Langage
    Réponses: 7
    Dernier message: 21/01/2009, 18h07
  4. [POO] Héritage et surcharge de méthodes
    Par defkid dans le forum Langage
    Réponses: 4
    Dernier message: 26/02/2007, 14h51
  5. [POO]héritage du constructeur de la classe parente
    Par new_wave dans le forum Langage
    Réponses: 7
    Dernier message: 10/03/2006, 14h25

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