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] Singleton en PHP et persistance


Sujet :

Langage PHP

Vue hybride

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

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut [POO] Singleton en PHP et persistance
    Bonjour à tous,

    voilà j'ai écrit un singleton en PHP5 et il fonction bien... mais seulement pour la durée de vie d'une page.
    N'y a t-il pas moyen de rendre un singleton réellement persistant ?

    voici mon code :

    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
    class fwk_messages {
         private static $_instance;
     
         private $attribut;
     
         private function __construct(){
             // rien juste histoire que le constructeur soit pas public
         }
     
         public function &getInstance(){
    	if (!isset(self::$_instance)) {
    		echo "<b><br>==>CREATION INSTANCE <br></b>";
    		self::$_instance = new fwk_messages(); 
    	}
    	return self::$_instance;
         }
     
         public function setAttribut( $a ){
             $this->attribut = $a ;
         }
    }
     
     
    // lorsque dans un script je fait :
     
    $truc = fwk_messages::getInstance();
    $truc->setAttribut( "Scoubidoo" );
     
    $bidule = fwk_messages::getInstance();
    // il recupere bien la meme instance le singleton est OK...
    par contre si dans ce script je met un lien html vers une autre page PHP et que je récupere l'instance du singleton.

    Et bien ce n'est plus la même, et du coup "attribut" est vide.

    Mon singleton n'a vécqu que le temps d'une page....

    Merci de votre aide

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    je pense que tu peux stocker ton instance en session et modifier getInstance()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_SESSION['fwk_messages'])) {
    self::$_instance = $_SESSION['fwk_messages'];
    }
    else if (!isset(self::$_instance)) {
    ...
    Si t'as pas la sérialisation auto faudra utiliser serialize()/unserialize().
    Le problème c'est qu'il faut copier l'objet en session à chaque fin de script.

    Bye

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut Merci beaucoup
    Citation Envoyé par Djakisback
    Salut,
    je pense que tu peux stocker ton instance en session et modifier getInstance()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_SESSION['fwk_messages'])) {
    self::$_instance = $_SESSION['fwk_messages'];
    }
    else if (!isset(self::$_instance)) {
    ...
    Si t'as pas la sérialisation auto faudra utiliser serialize()/unserialize().
    Le problème c'est qu'il faut copier l'objet en session à chaque fin de script.

    Bye


    je pensais également à cette solution.
    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton, mais bon il semble pas y avoir de meilleure solution.

    Du coup, je me suis pausé la question autant bosser en session et ne pas utiliser de singleton.... mais non le singleton reste tout de même mieux à mon sens, plus "propre POO parlant et, y a pas de risque qu'il soit cassé par innadvertence dans une autre partie du code (comme ca peu aussi être le cas avec des globales...bouu! j'M pô les globales )...

    Merci beaucoup pour votre contribution

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Effectivement en me relisant je me suis également dis que la classe singleton devenait pratiquement inutile ^^

    (PS : Je pense que tu as compris qu'avec cette soluce il y aura un singleton par client, sinon il faut prendre la soluce de NoT)

  5. #5
    NoT
    NoT est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Par défaut
    Salut,

    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton, mais bon il semble pas y avoir de meilleure solution.
    En même temps il faudrait te poser la question suivante : as-tu besoin de la persistence de tout ton objet ? Je veux dire l'objet fait la puissance de JAVA mais également une de ses grandes faiblesses, on veut faire de l'objet à tout va même là ou yen a pas forcément besoin.

    Dans ton cas à mon avis la persistence des données suffit, peut-etre même que de certaines données triées sur le volet, suivant le nombre, la structuration et l'accès que tu souhaites faire à ses données tu as de multiples choix techniques à faire.

  6. #6
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    Citation Envoyé par ProximIT
    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton,
    le "scope" session existe de la même façon qu'en Java mais si j'ai bien compris, tu as besoin du "scope" application et là en PHP tu peux reproduire ça à l'aide d'une base de données.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Par défaut Yes sir....
    Citation Envoyé par mathieu
    le "scope" session existe de la même façon qu'en Java mais si j'ai bien compris, tu as besoin du "scope" application et là en PHP tu peux reproduire ça à l'aide d'une base de données.

    C'est exactement ca.

    En fait voici mon problème : je doits développer une application Intranet (environ 80 utilisateurs intensifs et simultanés), utilisant une base de donnée sur SQL Server. Le problème est bien là, car la license disponible pour le serveur BDD n'authorise que 10 connexions simultanées.

    Il me faut donc absolument maîtriser le nombre de connexions à la base.


    Il faudrait concrètement que chaque utilisateur de l'application récupère la même instance de connection... ( ou une instance parmis X car je ferais certainement un Multiton plutôt qu'un Singleton)

    Merci beaucoup

  8. #8
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 698
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 698
    Par défaut
    Citation Envoyé par ProximIT
    car la license disponible pour le serveur BDD n'authorise que 10 connexions simultanées.
    utilise un autre SGBDR alors, il y en a plein en Open Source qui peuvent surement remplacer cette base de données limitée.
    et sinon, en théorie un simple fichier texte est aussi une base de données donc tu peux stocker ton objet dans un fichier

  9. #9
    NoT
    NoT est déconnecté
    Membre expérimenté
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Par défaut
    Salut,

    Il va falloir te pencher sur une sauvegarde manuelle des propriétés de ton objet, pour créer une persistence, c'est précisément l'utilité des fonctions serialize / deserialize de PHP :

    http://fr2.php.net/manual/fr/function.serialize.php
    http://fr2.php.net/manual/fr/function.unserialize.php

    Ou bien enregistrer manuellement chaque propriété de l'objet dans une base.

    Au choix suivant l'utilisation que tu fais ensuite de tes données.

    C'est à ma connaissance les seules façons de faire.

Discussions similaires

  1. [POO] Singleton et changement de page
    Par RR instinct dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2006, 05h58
  2. [POO] héritage en php
    Par zana74 dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2006, 09h50
  3. [POO] Site en PHP 5
    Par emstar dans le forum Langage
    Réponses: 8
    Dernier message: 11/04/2006, 14h36
  4. [POO] bug? de php
    Par XtofRoland dans le forum Langage
    Réponses: 11
    Dernier message: 21/02/2006, 14h54
  5. [POO] Question class php=>javascript
    Par jeff_! dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2006, 15h10

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