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 :

Problème de Singleton


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 49
    Par défaut Problème de Singleton
    Bonsoir,

    J'essaye desespérement depuis quelques temps de mettre en place le design pattern Singleton pour pouvoir me connecter à ma base de donnée

    Voici d'abord mon code de Singleton :

    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
    33
    34
    35
    36
    37
    <?php
     
     
    //Classe de connexion à la BDD - Design Pattern Singleton
    class Connection{
     
    	private static $instance;
    	private $host = 'localhost';
    	private $user = 'root';
    	private $password = '';
    	private $dbName = 'db354423753';
     
    	private function __construct() 
    	{	
    		try
    		{
    			self::$instance = new PDO('mysql:host=' . $this->$host . ';dbname=' . $this->$db, $this->$user, $this->$password);
     
    			self::$instance->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		}
    		catch (Exception $e)
    		{
    			die('Erreur de connexion: ' . $e->getMessage());
    		}
    	}
     
    	private function __clone() {}
     
    	static public function getInstance() 
    	{
    		if (! (self::$instance instanceof self) ) 
    		  self::$instance = new self();
     
    		return self::$instance;
    	}
     
    }
    Et je fais ensuite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $bdd = Connection::getInstance()->getBdd();
    Et paf un beau message d'erreur :

    Fatal error: Cannot access empty property in C:\wamp\www\Site\model\Connection.class.php on line 16
    Pourtant j'ai regardé pas mal d'autres code de Singleton et je vois vraiment pas ce qui ne vas pas dans le mien !

    Merci de votre aide, et bonne soirée !

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    $this->val pas $this->$val

  3. #3
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    En plus de ce que dit stealth (syntaxe des attributs de l'objet), le pattern n'est pas très bon ici.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    static public function getInstance() {
    	if (! (self::$instance instanceof self) ) 
    		self::$instance = new self();
    	return self::$instance;
    }
    Ici, à chaque fois que vous demandez "l'instance", vous regardez si la variable static "$instance" de l'objet Connection est une instance de l'objet Connection sinon vous le construisez.
    Or, dans le constructeur de Connection, vous mettez dans $instance un objet PDO...

    Donc à chaque fois que vous appelerez getInstance(), il instanciera un nouveau Connection.

    Ce serait plus un truc comme ça :

    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
    class Connection{
     
    	private static $instance;
    	protected $db; // sera un objet PDO
    	private $host = 'localhost';
    	private $user = 'root';
    	private $password = '';
    	private $dbName = 'db354423753';
     
    	private function __construct(){	
    		try{
    			$this->db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->db, $this->user, $this->password);
    			$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    		}catch(PDOException $e){
    			die('error : '.$e->getMessage());
    		}
    	}
     
    	private function __clone() {}
     
    	static public function getInstance() 
    	{
    		if (! (self::$instance instanceof self) ) 
    		  self::$instance = new self();
     
    		return self::$instance;
    	}
     
    }

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    autant faire juste un instanceof PDO

  5. #5
    Membre émérite

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Par défaut
    Moui, mais tu perds la possibilité de surcharger avec tes propres méthodes.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Connection::getInstance()->getAllArticles();
    te donnera une erreur car getAllArticles() n'existe pas pour la classe PDO.

    Or, rien ne t'empêche avec ma classe de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
    public function getAllArticles(){
        $sql = "SELECT * FROM ARTICLES WHERE ETAT = 1";
        $stmt = $this->db->prepare($sql);
        $stmt->execute();
        return $stmt->fetchAll();
    }
    ...
    Enfin, là, c'est un exemple un peu simple. Bref, ça créé des raccourcis pas trop mal et permet de surcharger un peu tout ça

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    t'utilises SingletonFactory et c'est réglé
    https://github.com/stealth35/SingletonFactory

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 49
    Par défaut
    Shikiryu, effectivement je vois le problème de instanceof, je vais changer ça.

    stealth, j'ai regardé ton Singleton Factory, mais ça m'a paru bien compliqué

    Benjamin, si je fais ta méthode qui consiste, si j'ai bien compris, à mettre une variable dans chaque classe qui contiendra l'instance de PDO, je n'ai plus besoin du singleton, c'est ça ?

    Mais bon, c'est le choix de adc15.
    Moi j'ai choisi ça parce que j'ai vu que c'était une bonne solution quand on se connectait à un serveur/bdd, après si y'en a d'autres plus adaptées je suis preneur...

    (et aucun retour de sa part )
    J'essayais de faire marcher mon bazar mais je vous avais pas oublié :p

Discussions similaires

  1. [PHP 5.2] Problème de singleton abstrait
    Par alejandro dans le forum Langage
    Réponses: 8
    Dernier message: 09/10/2009, 18h35
  2. Problème de singleton
    Par Monstros Velu dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 19/02/2009, 16h27
  3. Réponses: 6
    Dernier message: 24/06/2007, 22h11
  4. Réponses: 4
    Dernier message: 16/06/2007, 15h36
  5. [VS2005] Problème pour faire un singleton
    Par mister3957 dans le forum Visual C++
    Réponses: 2
    Dernier message: 01/02/2006, 09h55

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