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 :

Objet statique unique


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut Objet statique unique
    Bonjour,

    Je suis sur un projet assez important qui vise à développer un SI pour gérer des automates de vente. Le but est d'exposer des webservices à ces automates et de faire le lien avec des webservices externes.

    Il y a donc une forte composante "temps réel", pas forcément pour les webservices eux-mêmes mais pour toutes les tâches annexes de supervision, logging... Le choix du PHP me semble être une erreur mais il s'agit en fait de développer un POC avant de le refaire en Java Peu importe, je vais faire ce qu'on me demande...

    Et donc j'en suis à développer un composant de logging, et des questions essentielles sur le moteur PHP me viennent :

    - J'aimerais déclarer un composant Logger qui soit unique (singleton) et partagé par tous les appels faits par les automates... ça me semble impossible en PHP. Pour moi, chaque appel de webservice par un automate va ouvrir une session et donc une instance de chaque classe de l'applicatif (je suis clair ?).

    Voici le code de mon Logger, les appels étant faits en statique :
    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
    <?php
     
    require_once(__PATH__.'/../config/db.php');
    require_once('SiErreur.php');
     
    class Logger
    {
        private static $instance;
     
        private static $db;
        private static $logRequest;
     
        private function __construct()
        {
            try
            {
                self::$db = new PDO(  'mysql:host='.PARAMDB_HOTE_LOGGER.';dbname='.PARAMDB_NOMBD_LOGGER,
                                PARAMDB_USER_LOGGER, PARAMDB_MDP_LOGGER,
                                array(  PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
                                        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
                                        PDO::ATTR_PERSISTENT => true));
     
                // Requête préparée pour insérer chaque ligne de LOG
                self::$logRequest = self::$db->prepare(
                            "INSERT INTO test.LOG (ID_MV, DATE, HEURE, SI_CAT, EVT_TXT)
                            VALUES (:id_mv, :date, :heure, :si_cat, :evt_txt)");
     
                self::$instance = 1;
            } 
            catch(SiErreur $siE)
            {
                $siE->ecritErreur();
            }
        }
     
        public static function singleton() {
            if(!isset(self::$instance)) {
                $c = __CLASS__;
                self::$instance = new $c();
            }
            return self::$instance;
        } 
     
        public static function ecritLog($siCat, $evtTxt)
        {
            try
            {
                $i = 1/0;
                self::$logRequest->execute(array(   ':id_mv' => 'LOCALHOST', ':date' => date('Y-m-d'),
                                                    ':heure' => date('H:i:s'), ':si_cat' => $siCat,
                                                    ':evt_txt' => $evtTxt));
            }
            catch(SiErreur $siE)
            {
                $siE->ecritErreur();
            }    
        }
    }
     
    Logger::singleton();
     
    ?>
    Est-ce que mon singleton est un vrai singleton (au sens du pattern Java) ? Est-ce possible de créer ce type de composant en PHP, avec persistance de l'instance, et unicité de celle-ci ?


    Merci d'avance !

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Salut,

    Ton singleton n'est pas un vrai singleton au sens Pattern JAVA. Il l'est dans le cadre de l'exécution de ta page.

    ERE

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Merci pour l'infirmation !

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Bonjour,

    Je rencontre actuellement le même genre de problème.
    Avez vous pu établir un solution afin d'avoir un singleton au sens Pattern JAVA?

    Merci

  5. #5
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Bonjour,

    Le singleton java est-il vraiment persistant entre les sessions et entre les appels de page ?
    J'ai un peu de mal à concevoir comment cela peut se faire...

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Par défaut
    Voici un petit article intéressent sur la différence entre un singleton java et php:
    http://blog.grobmeier.de/2009/05/01/...iscussion.html

    Apparemment le singleton java est persistant dans une même jvm.

  7. #7
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Et plus généralement c'est pour l'instant une grosse différence entre Java et PHP: les classes peuvent rester chargées entre 2 appels, les servlets ne sont pas déchargées, on peut donc plus facilement gérer des pools de connexions etc...

    ERE

Discussions similaires

  1. travailler avec des objets statiques
    Par Romain227 dans le forum Débuter
    Réponses: 12
    Dernier message: 23/11/2011, 14h41
  2. Pool d'objets "statique"
    Par zeldomar dans le forum Boost
    Réponses: 0
    Dernier message: 29/11/2010, 16h26
  3. Réponses: 6
    Dernier message: 07/10/2009, 18h16
  4. Polymorphisme et objets statiques.
    Par winzzz dans le forum Débuter
    Réponses: 4
    Dernier message: 29/10/2008, 14h56
  5. Créer une liste d'objets statiques dans une classe
    Par crossbowman dans le forum C++
    Réponses: 3
    Dernier message: 13/03/2006, 09h11

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