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] Votre avis sur ma pseudo-fabrique


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    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 : 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
     
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Membre éclairé Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Par défaut
    Bonjour,

    Deja je ne vois pas d'ou vient $key dans __get() ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Par défaut
    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.

  4. #4
    Membre éclairé Avatar de B.Moncef
    Étudiant
    Inscrit en
    Août 2007
    Messages
    75
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 75
    Par défaut
    Dans ton code, le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    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 ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Par défaut
    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 : 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
     
    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

Discussions similaires

  1. Donnez votre avis sur les articles de Developpez.com
    Par Geronimo dans le forum C++Builder
    Réponses: 13
    Dernier message: 14/01/2007, 23h00
  2. Donnez votre avis sur les articles de Developpez
    Par Anomaly dans le forum Contribuez
    Réponses: 37
    Dernier message: 29/05/2006, 22h48
  3. [Débat] Votre avis sur la section "Dev Web"
    Par Marc Lussac dans le forum Evolutions du club
    Réponses: 31
    Dernier message: 03/03/2004, 21h55
  4. Votre avis sur le schema Relax NG...
    Par Bj dans le forum Valider
    Réponses: 8
    Dernier message: 19/09/2003, 18h30
  5. Votre avis sur 1 livre SVP
    Par cab dans le forum DirectX
    Réponses: 4
    Dernier message: 17/09/2003, 11h39

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