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] Initialisation de propriété statique de classe [PHP 5.1]


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 40
    Points
    40
    Par défaut [POO] Initialisation de propriété statique de classe
    Bonjour à tous,

    je viens du monde Java et j'avoue être un peu bloqué sur un truc qui paraît pourtant tout con. J'aurais aimé que l'un d'entre vous m'explique où je fais fausse route.

    Voila le problème : j'ai deux classes, une classe Logger avec une méthode d'instanciation 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
     
    <?php
        define("TRACE", 0);
        define("DEBUG", 1);
        define("INFO",  2);
        define("WARN",  3);
        define("ERROR", 4);
        define("FATAL", 5);
        define("OFF",   9);
     
        class Logger
        {       
            const mask   = "[%s][%s][%s] %s<br>";
     
            private $className  = NULL;
            private $debugLevel = NULL;
     
            private static $dateFormat = "d/m/Y H:i:s";
     
            private function __construct($className, $debugLevel)
            {
                $this->className  = $className;
                $this->debugLevel = $debugLevel;
            }
     
            public static function getLogger($className = NULL, $debugLevel = OFF)
            {
                $c = __CLASS__;
                return new $c($className, $debugLevel);
            }
     
            ...
    ?>
    et une autre classe qui doit disposer d'une propriété de ce type, partagée par toutes les instances de cette classe (donc statique ?).

    Voici son code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
        include_once("Logger.class.php");
     
        class MaClasse
        {
            protected static $logger = Logger::getLogger(__CLASS__,INFO);
            ....
        }
    Le problème, je pense c'est que l'opérateur :: est apparu après PHP 5.1.
    Pas de souci, me dis-je, je vais donc utiliser call_user_func(), mais sans succès

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <?php
        include_once("Logger.class.php");
     
        class MaClasse
        {
            protected static $logger = call_user_func("Logger","getLogger",__CLASS__,INFO);
            ....
        }
    Quelqu'un peut-il me dire où se situe mon erreur ?

    D'avance merci

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 422
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 422
    Points : 15 792
    Points
    15 792
    Par défaut
    Citation Envoyé par Tino13 Voir le message
    Le problème, je pense c'est que l'opérateur :: est apparu après PHP 5.1.
    non l'opérateur existe déjà depuis longtemps
    le problème c'est que les attributs ne peuvent pas être initialisés au moment de la définition de la classe mais seulement pendant l'exécution

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 40
    Points
    40
    Par défaut
    Soit !

    mais dans ce cas comment faire ?
    en Java par exemple il existe la section static qui donnerait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    protected static Integer monChamp = null;
    static
    {
        this.monChamp = new Integer(10);
    }
    Je n'ai rien trouvé de tel en PHP, j'ai vu qu'il y avait des méthodes magiques, n'y en a-t-il pas une qui m'irait ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    En PHP tu ne peux pas initialiser un membre de classe (statique ou non) avec une valeur non constante -> http://fr.php.net/manual/fr/keyword.class.php

    Les choses n'ont pas changé entre PHP 4 et PHP 5 sur ce point.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Points : 1 177
    Points
    1 177
    Par défaut
    Est-ce que ca pose probleme de le faire dans ton constructeur ?

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 50
    Points : 40
    Points
    40
    Par défaut
    Au début je l'avais fait dans le constructeur, mais j'ai d'autres méthodes statiques dans cette classe qui peuvent potentiellement être appelées avant.

    Pour info et pour ne pas rester bloqué, j'ai fait ce qui se fait en général en PHP, je me suis fait un accesseur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    <?php
        include_once("Logger.class.php");
     
        class MaClasse
        {
            protected static $logger = NULL;
            protected static function logger()
            {
                if (self::$logger === NULL) self::$logger = Logger::getLogger(__CLASS__,INFO);
                return self::$logger;
            }
            ....
        }
    et du coup au lieu d'écrire dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self::$logger->debug("Mon message");
    j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self::logger()->debug("Mon message");
    Si quelqu'un a mieux, je prendrai volontiers.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Déclarer méthode ou propriété statique dans classe
    Par mapmip dans le forum Ext JS / Sencha
    Réponses: 1
    Dernier message: 19/06/2013, 16h07
  2. [PHP 5.3] Sauvegarder les propriétés statiques d’une classe dans un fichier
    Par geforce dans le forum Langage
    Réponses: 1
    Dernier message: 26/04/2010, 03h05
  3. [POO] Accès à une propriété de la classe mère
    Par hornetbzz dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2010, 23h16
  4. recuperer la liste des propriétés statiques d'une classe ?
    Par Lorenzo77 dans le forum ActionScript 3
    Réponses: 1
    Dernier message: 22/11/2009, 12h50
  5. [PHP 5.2] [POO] Propriétés statiques non partagées par les classes filles
    Par gege2061 dans le forum Langage
    Réponses: 5
    Dernier message: 08/09/2009, 15h25

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