Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/09/2008, 12h37   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 24
Points : 3
Points : 3
Par défaut [POO] Héritage : instancier un objet fille à partir d'une instanciation de la mère

Bonjour,

En quelques termes imagés, voilà mon problème :
supposons que j'ai une classe mère Voiture dont hérite les classes Renault et Peugeot. Ma classe Voiture est instanciée à partir d'un fichier de données (XML), dans lequel est spécifié, entre autre, la marque du véhicule. Je n'ai pas de moyen simple d'accéder à cette information à partir de mon fichier de donnée, mais une fois ma classe mère instanciée, je peux très facilement l'obtenir. Mon problème devient évident : j'ai besoin d'instancier ma classe mère Voiture pour pouvoir obtenir l'info qui me permettrait de savoir quelle classe fille utiliser pour instancier mon objet : je dois avoir la voiture sous les yeux pour déterminer sa marque. Donc : est-il possible, une fois un objet mère instancié de le "caster" en objet fille, sans avoir à instancier à nouveau l'objet ?

Et si, comme je le soupçonne, ça n'est pas possible, connaissez vous une "bonne pratique", un design pattern, permettant de résoudre élégamment ce problème.

Merci.
lescarphe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 13h04   #2
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Pour la bonne pratique il faut regarder le pattern d'usinage je pense (factory).

Dans les faits, une voiture étant une voiture ? Qu'est censée représenter la classe Fille ? Les voitures de la marque renault ? Les quatres - quatres ?
Si c'est l'idée cela ne me semble pas être la bonne piste.
Une 2cv, ou un 44, à toujours 4 roues, effectue les braquages de la même manière, ce voit appliquer les couleurs de la même manière ect.

bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 13h52   #3
Rédacteur
 
Avatar de wamania
 
Développeur Web
Inscription : juillet 2003
Messages : 676
Détails du profil
Informations personnelles :
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2003
Messages : 676
Points : 678
Points : 678
Dès la lecture de ton post j'ai tiqué.
Effectivement, comme le dit Kaymak, la marque de voiture est une propriété de la voiture, et non une extension de possibilités.

Si c'est l'exemple qui est pas bon, mais que ton pb reste le même, je ferais effectivement un factory directement dans la classe voiture

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
class voiture {
 
    public static function factory() {
        //traitement pour savoir quel objet retourner
        return new Renault; // par exemple
    }
}
 
class renault extends voiture {
}
 
et tu appelles par
$mon_objet_ici_renault = voiture::factory();
__________________
Articles sur developpez.com
- Gestion des exceptions avec PHP5
- Chiffrement et hash en PHP contre l'attaque Man in the middle
- Aedituus - Espace membre sécurisé en PHP5

Lithium : ORM ActiveRecord PHP5 extrêmement léger
wamania est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2008, 14h15   #4
Invité de passage
 
Inscription : décembre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 24
Points : 3
Points : 3
Citation:
Envoyé par wamania Voir le message
Si c'est l'exemple qui est pas bon, mais que ton pb reste le même, je ferais effectivement un factory directement dans la classe voiture
Oui, l'exemple est mal choisi ; merci pour vos suggestions. Je vais regarder ça de plus près...

Edit : le problème de la factory, c'est que ça ne m'évite pas d'effectuer deux fois le chargement du fichier XML en structure DOM (opération effectué par le constructeur de la classe voiture si je veux avoir accès à la marque de la voiture), non ? en terme de performance ça revient en gros à instancier voiture, tester le type de voiture, instancier renault.
en plus, il y a un truc qui me chiffonne, c'est qu'alors Voiture doit connaitre toutes les classes potentielles qui peuvent hériter d'elle.
lescarphe est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 03h02   #5
Membre éprouvé
 
Avatar de mon_nom_est_personne
 
Inscription : mai 2008
Messages : 450
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 450
Points : 451
Points : 451
un petit rappelle de la difference entre static et non static :
- static interviens dans un contexte de classe.
- non static dans un contexte de l'objet

donc, quand tu sais ca il est tres facile de faire :

tester et approuver, bon pour copier/coller
Code :
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
 
class voiture {
    public static $monXml;
    public $constructeur;
 
    public static function Xml2Dom(){
        self::$monXml = array('renault' => 'r', 'nissan' => 'n');
    }
 
    public static function factory($nomFille) {
        //traitement pour savoir quel objet retourner
        return new $nomFille; // par exemple
    }
 
    public final function getMyXml()
     {
          return self::$monXml[$this->constructeur];
      }
}
 
class renault extends voiture {
 
     public function __construct(){
         $this->constructeur = "renault";
     }
 
}
 
class nissan extends voiture {
 
     public function __construct(){
         $this->constructeur = "nissan";
     }
 
}
 
voiture::Xml2Dom();
$mon_objet_ici_renault = voiture::factory('renault');
var_dump($mon_objet_ici_renault->getMyXml());
$mon_objet_ici_nissan = voiture::factory('nissan');
var_dump($mon_objet_ici_nissan->getMyXml());
J'ai traite mon xml qu'une fois, j'ai ecrit une methode intelligement, et maintenant je laisse la machine travailler pour moi.
pour plus d'info sur le pattern j'ai ecrit ce microscopique tuto, a la base c'etait pour expliquer les interfaces mais comme les deux sont relativement lies .
http://www.developpez.net/forums/d60...nterfaces-php/
mon_nom_est_personne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 09h21   #6
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
j'aurai rajouté une méthode static pour peupler l'objet voiture en fonction d'un tableau, ou d'un noeud XML (vu que c'est ce qui nous intéresse).

Sinon c'est tout à fait cela.
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 09h27   #7
Membre éprouvé
 
Avatar de mon_nom_est_personne
 
Inscription : mai 2008
Messages : 450
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 450
Points : 451
Points : 451
theoriquement c'est ce que ma methode static xml2dom fait. j'ai juste mis un array car j'aime quand je donne un exemple que le copier/coller marche pour comprendre.
mon_nom_est_personne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 09h47   #8
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
ah ok. J'avais pas compris cela comme il n'y avait pas d'arguments en entrée. Sa m'apprendra à lire au lieu de parcrourir.

a +
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2008, 16h19   #9
Invité de passage
 
Inscription : décembre 2007
Messages : 24
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 24
Points : 3
Points : 3
Citation:
Envoyé par mon_nom_est_personne Voir le message
donc, quand tu sais ca il est tres facile de faire :

tester et approuver, bon pour copier/coller
Merci pour ces précisions et ces remarques ; je regarde dès que j'ai le temps...
lescarphe est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 22h14.


 
 
 
 
Partenaires

Hébergement Web