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] __Get / __Set et héritage


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut [POO] __Get / __Set et héritage
    Est-il possible d'hérité des méthodes __Get et _Set ?

    J'essaye de faire un truc du genre :


    Ma class:
    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
    class Derive{
     
    	public function __construct() {
    	}
     
    		public function __get($nm){
     
    		if (isset($this->membre[$nm])) {
    			$r = $this->membre[$nm];
    			return $r;
    		} else {
    			return null;
    		}
    	}
     
    	public function __set($nm, $val){
    		if (isset($this->membre[$nm]))
    			$this->membre[$nm] = $val;
    	}
     
    	public function __isset($nm){
    		return isset($this->membre[$nm]);
    	}
     
    	public function __unset($nm){
    		unset($this->membre[$nm]);
    	}
    }
    Ma classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    require_once('derive.php');
    class Setter Extends Derive
    {
    	private $x = array("a" => 1, "b" => 2, "c" => 3);
     
    	public function __construct() {
    	}
    }

  2. #2
    Inactif Avatar de CR_Gio
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    1 195
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 195
    Points : 1 186
    Points
    1 186
    Par défaut
    Bonjour,

    Je crois qu'il faut faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    require_once('derive.php');
    class Setter Extends Derive
    {
    	private $x = array("a" => 1, "b" => 2, "c" => 3);
     
    	public function __construct() {
    		parent::__construct();
    	}
    	public function __get($nm) {
    		parent::__get($nm);
    	}
    }

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Points : 1 071
    Points
    1 071
    Par défaut
    A l'époque ou j'ai découvert ces méthodes magiques, je suis quasiment sûr qu'il fallait obligatoirement les mettre en private.
    Et bizarrement, même à l'heure actuelle, cela fonctionne en private, y compris l'héritage, ce qui est plutôt étrange.
    Enfin maintenant, ils disent qu'ils faut les mettre en public, ce qui ne change rien au final, vu le comportement actuel des méthodes.

    Donc moi ceci fonctionnne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class A {
        private function __get($key) {
        // ...
        }
    }
     
    class B extends A {
    }
     
    $b = new B;
    $b->toto = 'titi'; // Utilise la méthode __get de A

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut
    le problème c'est que le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private $x = array("a" => 1, "b" => 2, "c" => 3);
    n'est pas connu par la classe parent ...

    Ce n'est pas encore au point les __get et __set, mais c'est toujours ça de pris ...

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    331
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 331
    Points : 180
    Points
    180
    Par défaut
    Ruse de Siou :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Class Derive
    {
    	 private $x ;
     
    		public function __construct(&$proprietes) {
    			$this->x = $proprietes;
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    require_once('derive.php');
    class Setter Extends Derive
    {
    	private $x = array("a" => 1, "b" => 2, "c" => 3);
     
    	public function __construct() {
    		parent::__construct($this->x);
    	}
    }

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

Discussions similaires

  1. [POO] constructeurs, paramètres et héritage
    Par Belenos dans le forum Langage
    Réponses: 5
    Dernier message: 24/10/2009, 14h57
  2. __GET & __SET
    Par J_Lennon dans le forum Langage
    Réponses: 7
    Dernier message: 31/12/2008, 18h42
  3. [POO] Méthode static et héritage
    Par Mogwaï dans le forum Langage
    Réponses: 3
    Dernier message: 06/10/2008, 12h31
  4. [POO] Un Problème d'héritage?
    Par redsaint0 dans le forum Langage
    Réponses: 6
    Dernier message: 01/06/2007, 16h44
  5. Réponses: 3
    Dernier message: 30/08/2006, 15h35

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