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

  1. #1
    Membre régulier
    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
    Points : 107
    Points
    107
    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 éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    $this->val pas $this->$val

  3. #3
    Membre éclairé

    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
    Points : 735
    Points
    735
    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;
    	}
     
    }
    Je suis fervent utilisateur de PHP et de jQuery.
    Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur pour envoyer l'URL de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc…

  4. #4
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    autant faire juste un instanceof PDO

  5. #5
    Membre éclairé

    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
    Points : 735
    Points
    735
    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
    Je suis fervent utilisateur de PHP et de jQuery.
    Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur pour envoyer l'URL de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc…

  6. #6
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    t'utilises SingletonFactory et c'est réglé
    https://github.com/stealth35/SingletonFactory

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    @stealth - je savais en ouvrant le post que tu lui fourguerait ta classe.

    +1 à Stealth, son singleton factory est exactement ce qu'il te faut.
    Au passage, faire en sorte que les classes modèles utilisent un singleton revient exactement à mettre l'instance PDO dans les variables globales, c'est sale. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class TEST1 {
     
      // ...
     
      public function getSomething () {
         // ne pas faire
         $results = Database::query('UNE QUERY');
     
         // faire
         $results = $this->_database->query('UNE QUERY');
      } 
    }
    Au niveau design, les objets qui ont besoin de communiquer avec la base doivent porter dans leurs attributs le handle de connection de la base avec la quelle ils communiquent. C'est plus propre et surtout plus souple. A cet effet, tu peux par exemple munir ton constructeur du paramètre adéquat, comme par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class TEST2 {
     
      protected $_pdo = null;
     
      public function __construct (PDO $pdo, $id = false) {
         $this->_pdo = $pdo;
         if ($id !== false)
           $this->read($id);
      }
    }
    Tu n'as pas à te soucier de la mémoire dans ce cas car l'objet PDO est passé par référence, il n'y a donc pas de copie quand tu l'utilise comme dans cet exemple.

  8. #8
    Membre éclairé

    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
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    t'utilises SingletonFactory et c'est réglé
    https://github.com/stealth35/SingletonFactory
    Intéressant. Je ne m'étais pas intéressé à __callStatic() et votre classe est plutôt sympa.
    Mais au final, son titre est plutôt bon : c'est une usine à Singleton et ça ne résout en rien son interrogation (à moins que je ne l'ai pas compris.)

    créera bien une instance unique de singleton (ou la récupèrera) mais aucune méthode ne pourra y être ajoutée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Singleton::Connection();
    créera une instance de sa classe mais il ne saura pas la gérer (je pense).

    C'est gentil de me montrer, ce serait mieux de lui expliquer.

    @Benjamin : Au final ton dernier exemple est une évolution de mon exemple. L'avantage étant la possibilité d'avoir des connections à plusieurs bases en même temps.

    Quoi qu'il en soit, pour moi, un Singleton pour gérer la base de donnée est quasiment une hérésie. En cas d'évolution, on est bien embêté. C'est pour cela que je préfère soit la dernière proposition, soit la mienne
    Je suis fervent utilisateur de PHP et de jQuery.
    Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur pour envoyer l'URL de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc…

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Intéressant. Je ne m'étais pas intéressé à __callStatic() et votre classe est plutôt sympa.
    Attention: __callStatic est une nouveauté introduite par PHP 5.3 (pas sur tous les hebergeurs).

    Mais au final, son titre est plutôt bon
    C'est le nom du pattern.

    @Benjamin : Au final ton dernier exemple est une évolution de mon exemple. L'avantage étant la possibilité d'avoir des connections à plusieurs bases en même temps.
    Yep et surtout de découpler l'architecture (on pourrait aller beaucoup plus loin avec des adapters et un DAO mais bon, il faut rester simple).
    On peut voir la classe de Stealth en quelque sorte comme une Data Identity Map: son rôle est de servir des instances et de s'assurer qu'elles sont uniques. Mais ça reste une évolution de la notion de "variable globale" au fond...

  10. #10
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    si on veux rajouter des méthode il fait étendre PDO donc creer ca classe Connection comme une classe normale et le SingletonFactory la rendra en Singleton comme ça plus besoin de s’embêter

  11. #11
    Membre éclairé

    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
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Attention: __callStatic est une nouveauté introduite par PHP 5.3 (pas sur tous les hebergeurs).
    Oui, oui, j'ai vu ça dans la doc. C'est néanmoins bien cool. (J'ai du mal à suivre les nouveautés de PHP à chaque version, ça me les fait découvrir petit à petit et j'adore)

    Citation Envoyé par Benjamin Delespierre Voir le message
    C'est le nom du pattern.
    J'ai déjà utilisé le pattern Factory Et il porte toujours bien son nom !
    Le mélange des 2 patterns est néanmoins ingénieux.

    Citation Envoyé par Benjamin Delespierre Voir le message
    Mais ça reste une évolution de la notion de "variable globale" au fond...
    C'est ce qu'est un Singleton in-fine... C'est pour cela que je n'en suis pas un grand fan. (Même si parfois, pour aller vite, j'avoue, je suis tombé dedans )

    Citation Envoyé par stealth35 Voir le message
    si on veux rajouter des méthode il fait étendre PDO donc creer ca classe Connection comme une classe normale et le SingletonFactory la rendra en Singleton comme ça plus besoin de s’embêter
    Je reste sur mon "moui". Perso, au final, j'aurais fait soit ma méthode ou celle de Benjamin, soit un simple extension de PDO sans Singleton. Mais bon, c'est le choix de adc15.

    Au final, on s'est bien éloigné de sa question d'ailleurs
    (et aucun retour de sa part )
    Je suis fervent utilisateur de PHP et de jQuery.
    Après des études de graphisme, j'ai décidé de mélanger développement web et web design. J'ai ainsi donc créé mon site web de développeur web dans le Val d'Oise mais aussi plusieurs projets personnels.
    Dans les plus aboutis, vous pourrez trouver dans mon labo et dans mon devblog, une extension de navigateur pour envoyer l'URL de la page actuelle vers votre email pour lire plus tard ou sauvegarder, mon générateur de template HTML5, etc…

  12. #12
    Membre régulier
    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
    Points : 107
    Points
    107
    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

  13. #13
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Selon moi, le plus propre serait d'avoir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $obj = new MaClass(Singleton::PDO(), $id);
    Et puis si tu veux te simplifier la vie avec Singleton classique, en voici un:
    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    /**
     * Database Class
     *
     * This class manages an instance of PDO registered
     * as a singleton by the Singleton class
     *
     * @see cobalt\util\Singleton
     * @author Delespierre
     * @version 1.0.0
     * @package cobalt\data\source\database
     */
    abstract class Database extends Object {
     
        /**
         * Typo helper for PDO constructor
         * @param string $phptype
         * @param string $host
         * @param string $database
         * @param string $username = ""
         * @param string $password = ""
         * @return void
         * @throws PDOException
         */
        public static function open ($phptype, $host, $database, $username = "", $password = "", array $driver_options = array()) {
            $dsn = "$phptype:dbname=$database;host=$host";
            Singleton::PDO($dsn, $username, $password, $driver_options);
        }
     
        /**
         * Allow the use of the PDO Singleton directly
         * as Database static methods
         * @param string $name
         * @param array $args
         * @throws BadMethodCallException
         * @return mixed
         */
        public static function __callStatic ($name, $args) {
            $pdo = Singleton::PDO();
            if (is_callable(array($pdo, $name))) {
                switch (count($arguments)) {
                    case 0: return $pdo->$name(); break;
                    case 1: return $pdo->$name($args[0]); break;
                    case 2: return $pdo->$name($args[0], $args[1]); break;
                    case 3: return $pdo->$name($args[0], $args[1], $args[2]); break;
                    case 4: return $pdo->$name($args[0], $args[1], $args[2], $args[3]); break;
                    case 5: return $pdo->$name($args[0], $args[1], $args[2], $args[3], $args[4]); break;
                    default: return call_user_func_array(array($pdo, $name), $param_arr); break;
                }
            }
            else
                throw new BadMethodCallException("No such method: $name");
        }
     
        /**
         * Typo helper for PDO::prepare
         * @param string $statement
         * @param array $driver_options
         * @return PDOStatement
         */
        public static function prepare ($statement, array $driver_options = array()) {
            return Singleton::PDO()->prepare($statement, $driver_options);
        }
     
        /**
         * Typo helper for PDO::query.
         * @param string $statement
         * @return PDOStatement
         */
        public static function simpleQuery ($statement) {
            return Singleton::PDO()->query($statement);
        }
    }
    Edit - ah bah j'avais oublié que j'utilisai déjà la solution de Stealth là dedans
    Voilà donc ma version 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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    /**
     * Singleton
     *
     * @author Stealth35, Delespierre
     * @version 1.0.0
     * @package cobalt\util
     */
    final class Singleton extends Object
    {
        /**
         * Singleton's instances
         * @var object
         */
        private static $_instances;
     
        /**
         * Let the singleton use any namespaced
         * class.
         * @var string
         */
        private static $_current_namespace = '';
     
        /**
         * __callStatic overloading.
         *
         * Allow the use of the factory.
         * E.G.
         * > Singleton::PDO($dsn, $user, $pwd);
         *
         * @param string $name
         * @param array $arguments
         * @return object
         */
        public static function __callStatic($name, array $args) {
            $name = static::$_current_namespace . '\\' . $name;
            if(empty(static::$_instances[$name]) || !empty($args)) {
                $class = new ReflectionClass($name);
                static::$_instances[$name] = !empty($args) ? $class->newInstanceArgs($args) : $class->newInstance();
            }
            return static::$_instances[$name];
        }
     
        /**
         * Sets the namespace to be used
         * @param string $ns = ''
         * @return void
         */
        public static function setNamespace ($ns = '') {
            if (strpos($ns, '\\') === 0) $ns = substr($ns, 1);
            static::$_current_namespace = $ns;
        }
    }

  14. #14
    Membre régulier
    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
    Points : 107
    Points
    107
    Par défaut
    OK OK, par contre je comprends pas trop comment marche le deuxième code.

    Quand tu fais Singleton:: PDO(), qu'est ce qui est appelé, __callStatic() ?

  15. #15
    Expert éminent sénior

    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
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par adc15 Voir le message
    OK OK, par contre je comprends pas trop comment marche le deuxième code.

    Quand tu fais Singleton:: PDO(), qu'est ce qui est appelé, __callStatic() ?
    oui, puisque ma méthode PDO n'existe pas

  16. #16
    Membre régulier
    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
    Points : 107
    Points
    107
    Par défaut
    D'accord, je viens de comprendre comment marche __callStatic, mais c'est quoi l'intérêt de faire ça par rapport à créer une méthode classique tout simplement ?

  17. #17
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    C'est plus pratique et plus esthétique de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Singleton::PDO($dsn, $user, $pwd);
    Que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Singleton::factory("PDO", array($dsn, $user, $pwd));
    Mais le résultat est le même.

  18. #18
    Membre régulier
    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
    Points : 107
    Points
    107
    Par défaut
    Bon alors là je suis perdu, je vois plus du tout comment faire pour récupérer mon instance de PDO.

    A quelle endroit je dois créer mon objet PDO ?
    L'héritage d'Object n'est pas reconnu par wamp, et quand je l'enlève, et que je fais Singleton:DO(...), ça me dit qu'il ne trouve pas la méthode PDO()

  19. #19
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    A quelle endroit je dois créer mon objet PDO ?
    Durant le bootstrap, l'init si tu préfère, de l'application serait le mieux.

    L'héritage d'Object n'est pas reconnu par wamp
    ça ne veut rien dire, les classes héritent d’entre-elles, pas les objets...
    Si ta version de PHP est inférieure à 5.3.0, tu ne peux pas utiliser la méthode magique __callStatic.

  20. #20
    Membre régulier
    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
    Points : 107
    Points
    107
    Par défaut
    Mais l'objet PDO je suis censé le créer dans le singleton non ? Sinon il sert à rien...

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, 17h35
  2. Problème de singleton
    Par Monstros Velu dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 19/02/2009, 15h27
  3. Réponses: 6
    Dernier message: 24/06/2007, 21h11
  4. Réponses: 4
    Dernier message: 16/06/2007, 14h36
  5. [VS2005] Problème pour faire un singleton
    Par mister3957 dans le forum Visual C++
    Réponses: 2
    Dernier message: 01/02/2006, 08h55

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