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

PHP & Base de données Discussion :

Masques : Singleton dans Factory ?


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut Masques : Singleton dans Factory ?
    Bonjour !

    Dans le cadre de la création d'un CMS, j'ai créé une classe d'abstraction de base de données assortie des masques factory et singleton dont il y a un descriptif ici.

    L'idée se décompose ainsi (en partant des exemples PHP) :

    Classe d'abstraction : abstract Database

    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
    <?php
    abstract class Database 
    { 
        private static $instance = NULL; 
         
        public static function factory($class) 
        { 
           if (class_exists($class))  
           { 
              if(isset(self::$instance) && self::$instance instanceof $class) { 
                  return self::$instance; 
              } 
              self::$instance = new $class; 
              return self::$instance; 
                         
           } else { 
               throw new Exception('Classe introuvable.'); 
           }         
        } 
    
       public function __clone() 
       { 
           trigger_error('Le clônage n\'est pas autorisé.', E_USER_ERROR); 
       } 
    }
    ?>                  
     
    

    Exemple de classe membre : MySQL

    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
    
    <?php
    class MySQL extends Database
    { 
    private static $instance = NULL; 
    private $connection = FALSE; 
    
    protected function __construct() 
        { 
            $this->connect(); 
        } 
    
    
       // Méthode Singleton interne.        
      public static function getInstance() 
      { 
            if (!isset(self::$instance)) { 
                $class = __CLASS__; 
                self::$instance = new $class; 
            } 
             
            return self::$instance; 
      }
    
      // ... 
    ?>
    Utilisation

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     <?php
    $var = Database::factory('MySQL');
    ?> 
    
    ou (dans un autre script...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php 
    $var = MySQL::getInstance();
    ?> 
    Description :
    1. Vérifie si la classe demandée existe (MySQL).
    2. Vérifie si une instance existe déjà et si c'est une instance de la classe demandée.
    3. Si oui, l'instance existante est retournée.
    4. Sinon, une nouvelle instance et créée puis retournée.
    L'idée, c'est que les sous-classes (MySQL en l'occurence) pourraient être appellées par la classe d'abstraction (factory) ou alors par leur singleton interne.

    Ce qui fait que les sous-classes pourrait être instanciées indépendement, avec leur propre singleton.

    Note : J'ai légérement modifié le masque singleton, le constructeur est protected pour que la classe parente puisse fabriquer l'objet demandé.
    Dernière modification par Invité ; 11/07/2006 à 17h19.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    882
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 882
    Par défaut
    hello
    moi j'aime pas le fait de pouvoir appeler directement une methode d'une classe abstraite, je la metterai protected.

    sinon pense aussi je l'objet peu exister en session(cas d'un formulaire) ou tu dois pouvoir creer un autre objet avec des parametre different (connection a un serveur Mysql different)

  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 : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 695
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $var = Database::factory('MySQL');
    ?> 
     
    <?php 
    $var = MySQL::getInstance();
    ?>
    tu crées 2 instances de ta classe MySQL comme ceci
    car tu as 2 classes Database et MySQL, chacune avec une $instance en private static.
    Perso, je n'aurais même pas fait l'héritage et j'aurais mis le singleton dans la classe Database.
    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par wamania
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
    $var = Database::factory('MySQL');
    ?> 
     
    <?php 
    $var = MySQL::getInstance();
    ?>
    tu crées 2 instances de ta classe MySQL comme ceci
    car tu as 2 classes Database et MySQL, chacune avec une $instance en private static.
    Perso, je n'aurais même pas fait l'héritage et j'aurais mis le singleton dans la classe Database.
    Salut

    Je tiens à préciser que c'était pour l'exemple : Il y a deux moyen d'instancier la classe comme je l'ai dit, par sa classe abstraite (Database::factory) ou par son constructeur interne (MySQL::getInstance), évidemment, pas les deux en même temps dans le même script !! (Désolé, l'exemple était ambigue).

    La fonctionnalité a un but simple : Permettre de se passer de la classe mère (Database) et pouvoir utiliser la classe MySQL autre part que dans mon CMS natif...

    D'un autre coté (ce n'est pas dit ici), la classe Database intégre un certain nombre de méthodes abstraites, qui servent d'interface pour MySQL, SQLite, XML et la lecture/écriture de fichier génériques au sein du CMS. C'est sa raison d'être .
    Dernière modification par Invité ; 11/07/2006 à 17h43.

Discussions similaires

  1. Singleton dans dll ?
    Par KiwiJaune dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 18/02/2010, 15h25
  2. Les singletons dans une appli web?
    Par jowsuket dans le forum C#
    Réponses: 9
    Dernier message: 18/06/2009, 14h26
  3. Singleton dans une DLL
    Par mister3957 dans le forum C++
    Réponses: 9
    Dernier message: 24/03/2009, 10h01
  4. Réponses: 12
    Dernier message: 13/11/2007, 09h52
  5. [Tableaux] singleton et factory
    Par jeff_! dans le forum Langage
    Réponses: 6
    Dernier message: 17/03/2006, 14h24

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