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] Utiliser et écraser l'attribut de la classe parent


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut [POO] Utiliser et écraser l'attribut de la classe parent
    Bonjour,

    J'ai un problème de débutant en POO.

    J'ai 2 classes : musicien et guitariste. La classe guitariste hérite des attributs et méthodes de musicien class guitariste extends musicien { }.

    J'ai ce message d'erreur :
    Fatal error: Access to undeclared static property: musicien::$metier
    (fichier guitariste.class.php)

    Extraits du code :

    musicien.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class musicien {
       public $metier = "Musicien";
    }
    guitariste.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class guitariste {
       public $metier = "Guitariste";
     
       public function afficheMetier() {
          $metierprincipal = parent::$metier;
          $metierspecifique = $this->metier;
          $metiers = 'est ' . $metierprincipal . '(' . $metierspecifique . ')';
          echo $metiers;
       }
    }
    main.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    require_once('musicien.class.php');
    require_once('guitariste.class.php');
     
    $guitariste1 = new guitariste();
    $guitariste1->afficheMetier();
    J'ai besoin de garder le métier de base (musicien) et de préciser le métier spécifique si besoin (exemple "guitariste", "bassiste" via des classes dédiées).

    Si je déclare static $metier dans la classe mère (musicien) et que j'utilise un attribut nommé différemment pour les classes filles (public $metierspecifique par exemple), ça marche.

    Dois-je obligatoirement procéder ainsi ? N'y a t-il aucun moyen de conserver les mêmes attributs (classe abstraite ?).

    Merci.

  2. #2
    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
    Salut,

    pour faire cela tu as plusieurs manières
    celle la plus proche de la tienne en utilisant les constantes comme ç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
    23
    class Musicien
    {
       const METIER = "Musicien";
    }
     
     
    class Guitariste
        extends Musicien
    {
       const METIER = "Guitariste";
     
       public function afficheMetier()
       {
          $metierprincipal  = parent::METIER;
          $metierspecifique = self::METIER;
          $metiers = 'est ' . $metierprincipal . '(' . $metierspecifique . ')';
          echo $metiers;
       }
    }
     
     
    $guitariste1 = new Guitariste();
    $guitariste1->afficheMetier();
    et après tu peux utiliser le late static binding avec PHP 5.3+
    comme ceci :
    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
    class Musicien
    {
       static $metier = "Musicien";
     
       public function afficheMetier()
       {
          $metierprincipal  = self::$metier;
          $metierspecifique = static::$metier;  // late static binding
          $metiers = 'est ' . $metierprincipal . '(' . $metierspecifique . ')';
          echo $metiers;
       }
     
    }
     
     
    class Guitariste
        extends Musicien
    {
       static $metier = "Guitariste";
    }
     
     
    $guitariste1 = new Guitariste();
    $guitariste1->afficheMetier();
    Note bien les différences.
    Avec le LSB, tu joues sur la différence entre self:: et static:: et le LSB te permet de descendre le traitement dans la classe racine de l'arborescence et d'injecter à l'exécution la valeur d'une variable statique définie dans une classe dérivée.

    Et enfin une troisième qui mélange les deux : LSB et constante
    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
    class Musicien
    {
       const METIER = "Musicien";
     
       public function afficheMetier()
       {
          $metierprincipal  = self::METIER;
          $metierspecifique = static::METIER;
          $metiers = 'est ' . $metierprincipal . '(' . $metierspecifique . ')';
          echo $metiers;
       }
    }
     
     
    class Guitariste
        extends Musicien
    {
       const METIER = "Guitariste";
    }
     
     
    $guitariste1 = new Guitariste();
    $guitariste1->afficheMetier();

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Génial ! Merci beaucoup pour tous ces exemples et ces explications, c'est exactement ce que je cherchais.
    Je comprend mieux l'approche maintenant.

    J'avais réussi à résoudre mon problème en jouant sur les propriétés private et public mais c'était de la bidouille :

    musicien.class.php :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class musicien{
    	private $metier = "Musicien";
     
    	function afficheMetier() {
    		$metier = $this->metier;		
    		echo "Metier : $metier";
    	}	
     
    }
    guitariste.class.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class guitariste extends musicien {
    	public $metier = "Guitariste";
     
    	function afficheMetier() { 
    		$metierprincipal = parent::afficheMetier();		
    		$metier = $this->metier;
    		$metiers = $metierprincipal . ' (' . $metier .')';
    		echo $metiers;
    	}
    }

    musique.php

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $musicien1 = new musicien();
    $musicien1->afficheMetier();
    => affiche : Metier : Musicien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $guitariste1 = new guitariste();
    $guitariste1->afficheMetier();
    => affichait : Metier : Musicien (Guitariste)

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

Discussions similaires

  1. appel d'attribut de la classe parent
    Par mazoelles dans le forum Général Python
    Réponses: 2
    Dernier message: 10/06/2015, 18h10
  2. Classe comme attribut d'une classe parente
    Par tamerla dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 15/12/2014, 22h41
  3. [PHP 5.3] [POO]Utilisation de methodes venant d'une autre classe
    Par yann18 dans le forum Langage
    Réponses: 5
    Dernier message: 25/03/2011, 17h16
  4. Réponses: 1
    Dernier message: 02/05/2008, 20h34
  5. [POO] utiliser une méthode présente dans une autre classe
    Par arnaudperfect dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2007, 14h23

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