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 11/09/2007, 18h02   #1
Invité de passage
 
Inscription : juin 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 5
Points : 2
Points : 2
Par défaut [POO] Votre avis sur ma pseudo-fabrique

Salut à tous.

J'aimerais avoir vos avis sur un script en PHP.

Le but celui ci est d'avoir un class "mère" chargé d'instancier des objets à la demande ( une sorte de fabrique ) afin de les rendre tous accéssible à travers un seul et unique objet
Mais je veux instancier ces objets dynamiquement donc j'utilise __get() et __set()

la class core :
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
 
class core {
 
  public $obj = array();
  public $classArray = array();
 
  public function __construct()
  {
    $this->classArray['Voiture'] = 'Voiture';
    $this->classArray['Mobilette'] = 'Mobilette';
  }
 
 
  public function __get($className)
  {
    if( empty($this->classArray[$className]) ) {
      throw new Exception('Unknow class name');
    }
 
    if( !isset($this->obj[$key]) && !empty($this->classArray[$className]) ) {
      $this->{$$className} = $className;
    }
    return $this->obj[$className];
  }
 
 
  public function __set($key,$value)
  {
    $this->obj[$key] = new $value($this);
  }
 
}

ensuite voilà l'utilisation

Code :
1
2
3
 
$core = new core();
$core->Voiture->Avance();
j'ai bien sur une class Voiture avec une méthode Avance() !


Le script fonctionne correctement mais j'aurais bien aimé avoir d'autre points vue, peut etre y a t'il de meilleures solutions, ou peut etre que cette solution peu ou provoque déjà des problemes que je ne vois pas ..

Merci d'avance.
PeterPetrelli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 22h02   #2
Membre régulier
 
Avatar de B.Moncef
 
Étudiant
Inscription : août 2007
Messages : 75
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 75
Points : 83
Points : 83
Bonjour,

Deja je ne vois pas d'ou vient $key dans __get() ?
__________________
Pas de question techniques par MP
B.Moncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2007, 22h37   #3
Invité de passage
 
Inscription : juin 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 5
Points : 2
Points : 2
Tres juste , une bete erreur lorsque que j'ai écrit le code direct dans le forum ..

il faut lire return $this->obj[$className];


j'ai corrigé dans le post d'origine.
PeterPetrelli est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 04h37   #4
Membre régulier
 
Avatar de B.Moncef
 
Étudiant
Inscription : août 2007
Messages : 75
Détails du profil
Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : août 2007
Messages : 75
Points : 83
Points : 83
Dans ton code, le test
Code :
1
2
3
&& !empty($this->classArray[$className]) ) {
     $this->{$$className} = $className;
}
ne sert a rien, puisque tu fais deja ce test dans ton if precedent.

Tu as toujours un $key de plus

Et je ne vois pas a quoi sert ton tableau $obj ici ? pourquoi ne pas utiliser directement $classArray ? genre :
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
class core {
 
  public $classArray = array();
 
  public function __construct()
  {
    $this->classArray['Voiture'] = 'Voiture';
    $this->classArray['Mobilette'] = 'Mobilette';
  }
 
 
  public function __get($className)
  {
    if( empty($this->classArray[$className]) ) {
        $this->{$$className} = $className;
        $this->classArray[$className] = $this->{$$className};
    }
 
    return $this->classArray[$className];
  }
 
  public function __set($key,$value)
  {
    $this->classArray[$key] = new $value($this);
  }
 
}
N'ai je pas compris quelque chose ?
__________________
Pas de question techniques par MP
B.Moncef est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2007, 07h13   #5
Invité de passage
 
Inscription : juin 2007
Messages : 5
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 5
Points : 2
Points : 2
Mon tableau classArray permet
1 - de definir quel sont les class pouvant etre instancié
2 - de simplifier/modifier le nom de l'obet si besoin

si j'ai une classe tu type My_Dd_Adaptater_etc_etc

je peux nommer l'objet différement

exemple :

$this->classArray['db'] = 'My_Dd_Adaptater_etc_etc';

le tableau obj, lui est là pour contenir la liste des objets instancié.

Je préfère ne pas mélangé les 2.
Si je dois ( sait on jamais détruire un objet je ne pourrais plus l'instancier par la suite si j'utilisais le tableau classArray comme tu le suggère )

revoici donc le code sans erreur cette fois

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
 
class core {
 
  public $obj = array();
  public $classArray = array();
 
  public function __construct()
  {
    $this->classArray['Voiture'] = 'Le_Nom_De_Ma_Class_Voiture';
    $this->classArray['Mobilette'] = 'Mobilette';
  }
 
 
  public function __get($className)
  {
    if( empty($this->classArray[$className]) ) {
      throw new Exception('Unknow class name');
    }
 
    if( !isset($this->obj[$className]) ) {
      $this->{$$className} = $this->classArray[$className];
    }
    return $this->obj[$className];
  }
 
  public function __set($key,$value)
  {
    $this->obj[$key] = new $value($this);
  }
 
}

c'est en fait plus sur la logique et le design que j'aimerais discuter, est ce meilleur rmoyen de passer par __get() __set() ? ya t'il des méthodes plus robustes .. ?
Pour l'instant celle ci m'apparait bien , mais j'aime bien avoir d'autre points vue lorsque je fais un truc.

merci
PeterPetrelli 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 23h23.


 
 
 
 
Partenaires

Hébergement Web