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] Attribut de classe [PHP 5.0]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut [POO] Attribut de classe
    Bonjour,
    Je voudrais savoir quelle est l'utilité, en POO de déclarer un attribut comme attribut de classe ( déclaré de type static). Quelqu'un peut-il me fournir un exemple de situation dans lequelle la solution impose d'utiliser un attribut de classe ( déclaré static)?
    Merci

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    Bonjour,
    Je te parle de mémoire (donc à prendre avec des pincettes).
    Si tu déclares un attribut statique, il va être commun à toutes les instances de cette classe.
    Par exemple un compteur d'instance si tu as besoin de savoir combien d'instances de ton objet tu as crée.

  3. #3
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Citation Envoyé par Raideman Voir le message
    Bonjour,
    Je te parle de mémoire (donc à prendre avec des pincettes).
    Si tu déclares un attribut statique, il va être commun à toutes les instances de cette classe.
    Quelle est la différence si on déclarait avec "const"?

  4. #4
    Membre Expert Avatar de nosferapti
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 157
    Par défaut
    tu peux trouver toutes les informations dans la documentation officielle :
    http://fr2.php.net/oop5.static
    http://fr2.php.net/oop5.constants

  5. #5
    Membre Expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Par défaut
    Si tu déclares un attribut statique, il va être commun à toutes les instances de cette classe.
    Pas tout à fait, un attribut statique n'est associé à aucune instance, mais à la définition de la classe.

    Pour preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class myClass{
        public static $var = 'TOTO';
    }
     
    myClass::$var = 'TITI';
    et je n'ai pourtant pas créé d'instance.

    Quelle est la différence si on déclarait avec "const"?
    const créé une constante, une constante est par définition "constante" et sa valeur de ne peut donc pas être "variable".

    Quelqu'un peut-il me fournir un exemple de situation dans lequelle la solution impose d'utiliser un attribut de classe
    Cela ne s'impose "jamais", tu peux toujours trouver une solution plus dégueulasse qu'une autre

    Mais par exemple, cela peut servir pour une classe qui stockes les requêtes SQL executées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class sqlConn{
        private $_queries = array();
     
        public static function query($queryString){
            self::$_queries[] = $queryString;
        }
    }
    mais des millions (milliards) de choses encore...

  6. #6
    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
    Citation Envoyé par ThomasR Voir le message
    Cela ne s'impose "jamais", tu peux toujours trouver une solution plus dégueulasse qu'une autre
    [hs]LOL, j'aime beaucoup ![/hs]

    Pour revenir au sujet, un exemple assez courant de l'utilisation d'une variable statique se retrouve dans le pattern Singleton appliqué à php.

  7. #7
    Membre averti
    Inscrit en
    Mai 2006
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 11
    Par défaut
    Citation Envoyé par ThomasR Voir le message
    Pas tout à fait, un attribut statique n'est associé à aucune instance, mais à la définition de la classe.

    Pour preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class myClass{
        public static $var = 'TOTO';
    }
     
    myClass::$var = 'TITI';
    et je n'ai pourtant pas créé d'instance.
    Soit. Mais voyons l'exemple ci-dessous. ce n'est qu'un extrait. L'idée c'est de générer une entrée dans 1 fichier de log ( désigné par la variable static $_logfile)chaque fois qu'une instance est créée.

    En le testant effectivement toute instance accède à cet attribut ( en générant 1 entrée) quand bien même il est déclaré "static". N'est ce pas contradictoire avec ce que vous dites en affirmant qu'1 tel attribut n'est associé à aucune instance?

    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
    <?php
    class User
    {
        protected $_login;
        protected $_pass;
        protected $_status = 0;
        protected $_level  = 0;
        protected $_fp;
        protected static $_logFile = "log.log";
     
        const LOG_FORMAT = "Message de log (%d) - *%s*";
     
        public function __construct($login = 'root', $pass = 'secret')
        {
            $this->_login = $login;
            $this->_pass  = $pass;
            $this->_fp = fopen(__DIR__ . '/' . self::$_logFile, "a");
            $this->_writeToLog(" construction");
       }
     
       public function __wakeup()
        {
            $this->_fp = fopen(__DIR__ . '/' . self::$_logFile, "a");
            $this->_writeToLog("désérialisation");
        }
     
        protected function _writeToLog($message)
        {
            fwrite($this->_fp, sprintf(self::LOG_FORMAT, time(), $message) . PHP_EOL);
        }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/03/2007, 23h23
  2. [POO] [PHP 5 CLASSES]Source à part?
    Par Jean_Benoit dans le forum Langage
    Réponses: 3
    Dernier message: 20/10/2005, 12h50
  3. [POO] Ecrire une classe descendante
    Par GLDavid dans le forum Langage
    Réponses: 4
    Dernier message: 14/10/2005, 20h04
  4. Réponses: 2
    Dernier message: 09/10/2005, 16h35
  5. Réponses: 9
    Dernier message: 02/09/2005, 16h44

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