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] Contrôle lors de l'accès à une variable statique


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut [POO] Contrôle lors de l'accès à une variable statique
    Bonjour,

    Je sais qu'il est possible d'effectuer un contrôle lors de l'accès à une variable non statique d'une classe en PHP5 (grâce aux méthodes __get et __set) mais qu'en est-il pour les variables statiques ?

    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
     
    class MyClass
    {
        public static $myStaticNumeric = 6;
        protected $myNumeric = 5;
        public function __construct() {}
        public function __get($name)
        {
            if ($name == "num")
                return ($this->myNumeric);
            else
                echo "ERROR !";
        }
        public function __set($name, $value)
        {
            if (($name == "num") && is_numeric($value))
                $this->myNumeric = $value;
            else
                echo "ERROR !";
        }
    }
     
    $object = new MyClass();
    $object->num = 4; // OK
    $object->num = "texte"; // ERROR !
     
    MyClass::$myStaticNumeric = "texte"; // OK, car aucun contrôle.

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    C'est quoi l'utilité de vouloir modifier une variable statique. Si tu la modifies, il ne faut pas la mettre statique

    Guillaume

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Une variable statique c'est juste une variable de la classe qui est accessible sans avoir besoin de créer une instance de la classe. Elle n'est pas obligée de garder la même valeur en permanence.

    Exemple simple : Si je veux compter le nombre d'instances d'une classe MyClass qui ont été créées à un moment donné dans le script php. Une des solution est d'ajouter dans la classe MyClass, une variable statique qui sera incrémentée à chaque fois qu'une instance de la classe sera construite. Ainsi à n'importe quel moment si je veux connaître cette valeur, je n'ai pas besoin d'avoir une instance sous la main, il suffit d'accéder à cette variable statique (Cet exemple n'a aucune utilité je te l'accorde).

    Enfin bref, le bout de code que j'ai fourni n'est peut être pas assez clair je suis désolé. Ma question portait plus sur le contrôle lors de la lecture et non la modification d'une variable statique, c'est-à-dire s'il existe une méthode à définir qui permettrait d'effectuer le même contrôle qu'avec la méthode __get pour les variables non statiques.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Détails sur mon problème :

    Actuellement, mes messages d'erreurs sont stockés dans un fichier XML (plutard ceux-ci seront traduit en plusieurs langues) et durant le déroulement de l'application, ils sont chargés (une seule fois) dans une classe ExceptionMessage. Mais pour accéder à ces messages, je trouve la méthode trop fastidieuse.

    Voilà un bout de mon script :
    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
     
    class ExceptionMessage
    {
        private static $_instance; // Singleton.
        private $_listMessages;
     
        public static function getInstance()
        {
            if (!isset(self::_instance))
                self::_instance = new MessageException();
            return (self::_instance);
        }
     
        private function __construct()
        {
            // constructeur accessible seulement à partir de getInstance().
            $this->_listMessages = array();
            $this->loadMessage();
        }
     
        private function loadMessages()
        {
            // Charge les messages du fichier XML dans le tableau associatif
            // $_listMessages, le tableau ressemble en gros à ca :
            // $_listMessages["PARAMETER_HTMLBODY"] = "Parameter '{0}' must be a HTMLBody type."
            // $_listMessages["INDEX_UNDEFINED"] = "Index '{0}' is undefined."
            // ...
        }
     
        public function __get($name)
        {
            if (in_array($name, array_keys($this->_listMessages)))
                return ($this->_listMessages[$name]);
            else
                return (-1);
        }
    }
    Pour accéder à un message, voilà la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $instance = ExceptionMessage::getInstance();
    echo $instance->INDEX_UNDEFINED;
    S'il était possible d'effectuer un contrôle lors de l'accès à une variable statique comme le fait __get pour les variables non statique, la syntaxe serait plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo ExceptionMessage::INDEX_UNDEFINED;
    // ou
    echo ExceptionMessage::$INDEX_UNDEFINED;
    Voili voilou, j'ai tenté d'être le plus clair possible. J'espère que la solution existe.

  5. #5
    Membre expert

    Profil pro
    imposteur
    Inscrit en
    Avril 2003
    Messages
    3 308
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : imposteur

    Informations forums :
    Inscription : Avril 2003
    Messages : 3 308
    Points : 3 377
    Points
    3 377
    Par défaut
    Citation Envoyé par Gat-
    Ma question portait plus sur le contrôle lors de la lecture et non la modification d'une variable statique, c'est-à-dire s'il existe une méthode à définir qui permettrait d'effectuer le même contrôle qu'avec la méthode __get pour les variables non statiques.
    Je ne suis pas sûr que ça soit possible avec la surcharge, vu qu'en PHP5 les méthodes de type __get ne sont appelées que pour des variables qui ne sont pas déclarées comme membres de l'objet.

    Si tu trouves un moyen de contourner merci de le faire savoir ici ! J'ai pas de solution pour l'instant mais ça m'intéresse...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 92
    Points : 83
    Points
    83
    Par défaut
    Je n'ai pas encore trouvé la méthode à définir pour pouvoir gérer ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // Interdire car $myNumeric est de type numéric.
    MyClass::$myNumeric = "Texte";
     
    // Vérifier que $KEY est une clé d'un tableau associatif
    // et renvoyé la valeur correspondante.
    $var = MyClass::$KEY;
    Néanmoins pour mon problème, j'ai une solution de dernier recours que j'utiliserai si vraiment il n'est pas possible de faire ce que je souhaite
    "ExceptionMessage::$INDEX_UNDEFINED" ou "ExceptionMessage::INDEX_UNDEFINED",
    et qui est de créer une méthode statique qui va effectuer le contrôle, de la même manière que __get.
    Ainsi pour accéder à mes messages la syntaxe sera la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo ExceptionMessage::getMessage("INDEX_UNDEFINED");

Discussions similaires

  1. [POO] Accès à une variable impossible!
    Par k o D dans le forum Langage
    Réponses: 34
    Dernier message: 25/11/2008, 15h17
  2. [POO] Accès à une variable de la classe parent
    Par escteban dans le forum Langage
    Réponses: 5
    Dernier message: 22/05/2008, 09h26
  3. [POO] Problème d'accès à une variable privée
    Par Nadd dans le forum Langage
    Réponses: 8
    Dernier message: 17/09/2006, 21h43
  4. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55
  5. Pb lors de l'accès à une surface DirectDraw
    Par Mark53 dans le forum DirectX
    Réponses: 8
    Dernier message: 30/11/2004, 00h03

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