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] Souci sur héritage [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut [POO] Souci sur héritage
    Salutations !

    Je m'en viens vers vous car je ne trouve pas de solution à mon petit souci.
    J'ai du mal comprendre un aspect de la notion d'héritage en objet et je me heurte à un petit mur que j'espère vous m'aiderez à franchir.

    Voici le type de souci que j'ai :
    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
     
    class Animal
    {
        public function Mouvement()
        {
            // script de mouvement
     
            // On rencontre un autre animal pendant le mouvement ? on lui dit bonjour
            echo $this->Bonjour($animal);
        }
        private function Bonjour($animal)
        {
            $texte = 'Bonjour '.get_class($animal);
            return $texte
        }
    }
     
    class Chat extends Animals
    {
        private function Bonjour($animal)
        {
            $type = get_class($animal);
     
            switch($type)
            {
                case 'Chien':
                    $texte = 'Le chat fuit, il a peur du chien';
                    break;
                case default:
                    $texte = 'Bonjour '.$type;
                    break;
            }
            return $texte
        }
    }
     
    class Chien extends Animals
    {
    }
    Quoi qu'il advienne si un chat rencontre un autre animal, c'est toujours la fonction Bonjour de la classe Animal qui est appelée et non pas celle qui la remplace dans Chat.

    Où se situe mon erreur ?

    Merci d'avance pour votre aide.

    Edit :
    Je viens de trouver une solution à mon souci à l'instant.
    Mais est-ce la bonne méthode ?
    Merci.

    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
     
    class Animal
    {
        public function Mouvement()
        {
            // script de mouvement
     
            // On rencontre un autre animal pendant le mouvement ? on lui dit bonjour
            $class = get_class($animal);
            echo $class::Bonjour($animal);
        }
        public function Bonjour($animal)
        {
            $texte = 'Bonjour '.get_class($animal);
            return $texte
        }
    }
     
    class Chat extends Animals
    {
        public function Bonjour($animal)
        {
            $type = get_class($animal);
     
            switch($type)
            {
                case 'Chien':
                    $texte = 'Le chat fuit, il a peur du chien';
                    break;
                case default:
                    $texte = 'Bonjour '.$type;
                    break;
            }
            return $texte
        }
    }
     
    class Chien extends Animals
    {
    }

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    mais t'as testé ton code ???
    parce que il est complétement faux.

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Afin de simplifier la demande, voici un code complet qui fonctionne et qui illustre mieux ma question :

    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
    class Animal
    {
    	private $_nom; // le nom de l'animal
    	private $_position; // sa position dans la rue
     
        public function Mouvement($pas, $animaux)
        {
            while ($pas > 0)
    		{
    			$this->_position ++;
     
    			// un animal est-il présent dans la case d'arrivé ?
    			foreach ($animaux as $animal)
    			{
    				$animal_position = $animal->Position();
     
    				// si oui on lui dit bonjour
    				if ($this->_position == $animal_position && $this != $animal)
    				{
    					echo $this->Bonjour($animal);
    				}
    			}
    			$pas --;
    		}
        }
     
    	public function Position()
    	{
    		return $this->_position;
    	}
     
        private function Bonjour($animal)
        {
            $texte = 'Bonjour '.get_class($animal);
            return $texte;
        }
     
    	public function __construct($nom, $position)
    	{
    		$this->_nom = $nom;
    		$this->_position = $position;
    	}
    }
     
    class Chat extends Animal
    {
        private function Bonjour($animal)
        {
            $type = get_class($animal);
     
            switch($type)
            {
                case 'Chien':
                    $texte = 'Le chat fuit, il a peur du chien';
                    break;
                default:
                    $texte = 'Bonjour '.$type;
                    break;
            }
            return $texte;
        }
    }
     
    class Chien extends Animal
    {
    }
     
    $medor = new Chien('medor', 4);
    $catzie = new Chat('catzie', 1);
     
    $rue = array($medor, $catzie);
     
    $catzie->Mouvement(5, $rue);

  4. #4
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    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
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    <?php
    class Animal
    {
    	private $_nom; // le nom de l'animal
    	private $_position; // sa position dans la rue
     
        public function Mouvement($pas, $animaux)
        {
            while ($pas > 0)
    		{
    			$this->_position ++;
     
    			// un animal est-il présent dans la case d'arrivé ?
    			foreach ($animaux as $animal)
    			{
    				$animal_position = $animal->Position();
     
    				// si oui on lui dit bonjour
    				if ($this->_position == $animal_position && $this != $animal)
    				{
    					echo $this->Bonjour($animal);
    				}
    			}
    			$pas --;
    		}
        }
     
        public function Position()
        {
    	return $this->_position;
        }
     
        protected function Bonjour($animal)
        {
            $texte = 'Bonjour '.get_class($animal);
            return $texte;
        }
     
    	public function __construct($nom, $position)
    	{
    		$this->_nom = $nom;
    		$this->_position = $position;
    	}
    }
     
    class Chat extends Animal
    {
        protected function Bonjour($animal)
        {
            $type = get_class($animal);
     
            switch($type)
            {
                case 'Chien':
                    $texte = 'Le chat fuit, il a peur du chien';
                    break;
                default:
                    $texte = 'Bonjour '.$type;
                    break;
            }
            return $texte;
        }
    }
     
    class Chien extends Animal
    {
    }
     
    $medor = new Chien('medor', 4);
    $catzie = new Chat('catzie', 1);
     
    $rue = array($medor, $catzie);
     
    $catzie->Mouvement(5, $rue);
    echo '<br />';
    $medor->Mouvement(5, $rue);
    Je viens de trouver une solution à mon souci, une vrai ^^

    En passant les function bonjour de private à protected cela fonctionne parfaitement.

    J'ai vraiment des soucis pour savoir quand utiliser protected à la place de private parfois j'avoue...

    edit :
    @Stealth35
    désolé si mon premier message était peu clair, je n'avais pas indiqué le code en entier, mais juste sa structure pour indiquer les liaisons qui me posaient souci, je pensais que ce serait suffisant.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Salutation

    La visibilité protected (pour les méthodes aussi bien que les attributs) s'utilise dès lors qu'il y a de l'héritage et que l'on souhaite que les méthodes dites "protégée" soit visible dans les classes filles.

    La visibilité private ne rend visible un attribut/méthodes qu'à la classe où l'élément est déclaré

    Et voilà

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Je vais compléter la réponse de Cocoww :
    tu peux aussi accéder aux membres privés d'une classe de l'extérieur à la seule condition qu'une classe (A) au sein d'une classe (B) soit de même nature que la classe contenante (A <=> B).

    Bref un exemple vaut mieux qu'un long discours :
    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
    <?php
     
    class Foo {
     
       private $_text; // MEMBRE PRIVE
     
       function getText() {
          return $this->_text;
       }
     
       function test() {
          $f = new Foo();
          $f->_text = 'abc'; // ICI ON ACCEDE DIRECTEMENT A UN MEMBRE PRIVE DE $f
          return $f->getText();
       }
    }
     
    $n = new Foo();
    $a = $n->test(); // $a = 'abc'
     
    ?>

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Xysyo Voir le message
    Bonjour,

    Je vais compléter la réponse de Cocoww :
    tu peux aussi accéder aux membres privés d'une classe de l'extérieur à la seule condition qu'une classe (A) au sein d'une classe (B) soit de même nature que la classe contenante (A <=> B).

    Bref un exemple vaut mieux qu'un long discours :
    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
    <?php
     
    class Foo {
     
       private $_text; // MEMBRE PRIVE
     
       function getText() {
          return $this->_text;
       }
     
       function test() {
          $f = new Foo();
          $f->_text = 'abc'; // ICI ON ACCEDE DIRECTEMENT A UN MEMBRE PRIVE DE $f
          return $f->getText();
       }
    }
     
    $n = new Foo();
    $a = $n->test(); // $a = 'abc'
     
    ?>
    Je ne savais pas, merci pour l'explication
    En revanche pardonne moi mais, ... je ne vois pas l'intérêt [direct] d'une telle implémentation!
    Tu peux en dire plus silteplé ?

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Bonjour
    Citation Envoyé par Cocoww Voir le message
    Tu peux en dire plus silteplé ?
    C'est clair que cela n'est pas très utile à première vue mais c'est pratique dans le cas où tu dois gérer par exemple une arborescence à l'aveugle (sans distinguer les noeuds des feuilles). Tu pars du principe que tout est de même nature et que les éléments s'imbriquent les uns dans les autres. Dans ce cas, lors de certains taitements il est bien plus propre (voire pratique) d'accéder directement à un attribut privé d'un élement en cours de rattachement que de passer par des mutateurs qui peuvent avoir des signatures très verbeuses juste pour modifier un attribut (vécu).

    Mais je te rassure tu peux t'en passer.

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

Discussions similaires

  1. [POO] Pointeur sur fonction membre et héritage
    Par MrDuChnok dans le forum C++
    Réponses: 9
    Dernier message: 20/07/2006, 17h19
  2. Petit souci sur la libération d'une connexion tcp
    Par alexandre75 dans le forum Développement
    Réponses: 1
    Dernier message: 08/11/2005, 19h43
  3. souci sur ajout de données de zone de liste
    Par Tierisa dans le forum IHM
    Réponses: 6
    Dernier message: 27/09/2005, 08h30
  4. [CSS2] Souci d'héritage et de priorité des styles.
    Par ARRG dans le forum Mise en page CSS
    Réponses: 5
    Dernier message: 12/07/2005, 09h03
  5. [POO]Interdire l'héritage
    Par Coulon Arnaud dans le forum Langage
    Réponses: 7
    Dernier message: 06/04/2005, 16h20

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