Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/02/2008, 15h25   #1
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Par défaut [POO] Définition des variables membre static

Bonjour,

Existe t-il un moyen d'utiliser des opérateurs lors de la définition d'une variable statique de classe en PHP5?

Par exemple le code suivant génère des erreurs :
Code :
1
2
3
4
5
6
7
8
9
 
<?php
class Test {
 
  static $staticVar1 = 1 + 2;         // erreur : Parse error: syntax error, unexpected '+', expecting ',' or ';'
 
  static $staticVar2 = 0001 | 0002;   // erreur : Parse error: syntax error, unexpected '|', expecting ',' or ';'
}
?>
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 15h30   #2
Membre actif
 
Homme
Développeur Web
Inscription : juillet 2007
Messages : 193
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2007
Messages : 193
Points : 189
Points : 189
?? le mot cclé static sur une variable. Jamais vu, pour moi c'est public, private ou protected.
metfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 15h35   #3
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Essaye static public $var. Mais quel interet dans un objet ?

Citation:
?? le mot cclé static sur une variable. Jamais vu, pour moi c'est public, private ou protected.
Si mais pas dans un objet.

Citation:
Envoyé par php.net
Utilisation des variables static

Une autre caractéristique importante de la portée des variables est la notion de variable static. Une variable statique a une portée locale uniquement, mais elle ne perd pas sa valeur lorsque le script appelle la fonction.
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 15h40   #4
Membre actif
 
Homme
Développeur Web
Inscription : juillet 2007
Messages : 193
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : juillet 2007
Messages : 193
Points : 189
Points : 189
Cool j'ai appris un truc, merci.
metfan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 16h17   #5
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Oui, on peut utiliser les variables static dans les classes :
http://fr.php.net/manual/fr/language.oop5.static.php

Quand à la définition de la visibilité (private, protected ou public), elle doit être faite avant la déclaration static pour respecter la compatibilité avec PHP4. Par défaut, une variable static est publique.

Mais ma question portait plus sur l'utilisation des opérateurs à droite de l'opérateur '=' lors de la définition de la variable static. Celle-ci ne semble pas être autorisée, mais je n'ai encore rien lu à ce propos...

Quand à l'intérêt d'une telle définition, c'est pour définir la configuration d'un logger dont les fonctions sont static :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
<?php
class Logger {
 
  const DEBUG   = 0001;
  const WARNING = 0002;
  const ERROR   = 0004;
  ...
 
  // J'ainerais faire qq chose du genre :
  static $logLevel = self::DEBUG | self::ERROR;
}
?>
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h13   #6
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Salut,

Pour ce que j'en sais, et sa date un peu, style php 5.0??. Non tu ne peux pas !

Tu vas devoir le définir en dehors de la classe, genre :
Code :
1
2
3
4
5
6
 
class x
{
public static $r;
}
x::$r = new toto(); // ou ce que tu veux !
En tout cas je procède ainsi me concernant.

Par contre, pourrais tu m'expliquer cette syntaxe :
static $logLevel = self::DEBUG | self::ERROR;

Je dois bien avouer qu'elle est des plus obscures pour moi ! Et ce depuis toujours ....

bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h27   #7
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Ca ne m'arrange pas du tout. Bon, il va falloir que je trouve un autre moyen alors.

Citation:
Par contre, pourrais tu m'expliquer cette syntaxe :
static $logLevel = self:: DEBUG | self::ERROR;

Je dois bien avouer qu'elle est des plus obscures pour moi ! Et ce depuis toujours ....
- Déclaration d'une variable statique de classe $logLevel,
- Affectée avec le résultat d'un OU binaire entre deux constantes définies dans la même classe :
DEBUG = 0001 (0001 en binaire)
ERROR = 0004 (0100 en binaire)

self:: DEBUG | self::ERROR === 0005 (0101 en binaire)


PS : self:: DEBUG sans espace fait self:EBUG - Pas très pratique...
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h36   #8
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Code :
1
2
3
4
DEBUG = 0001 (0001 en binaire)
ERROR = 0004 (0100 en binaire)
 
self::DEBUG | self::ERROR === 0005 (0101 en binaire)

aie, c'est du binaire... C'est pour cela que ca m'echappe totalement ! Faudrait que je m'y mette un jour, sa à l'air plutôt pratique.

PS: il faut desactiver les smileys dans le message :) cf les options supplémentaires lorsque tu postes (en dessous des boutons envoyer la réponse, et prévisu).
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2008, 17h54   #9
Membre chevronné
 
Avatar de |PaRa-BoL
 
Inscription : novembre 2003
Messages : 737
Détails du profil
Informations personnelles :
Âge : 25

Informations forums :
Inscription : novembre 2003
Messages : 737
Points : 782
Points : 782
Je ne comprend toujours pas pourquoi tu souhaites définir des variables statics dans une classe.
Les valeurs de ta variables garderons de toute façons leur valeurs si tu reste dans le contexte objet. (C'est le but).

Au pire tu fais quelques chose comme ca dans un fichier de conf :

Code php :
1
2
3
4
5
 
define('__DEBUG__', 1<<1);
define('__WARNING__', 1<<2);
define('__ERRORS__', 1<<3);
define('__PARANOID__', 1<<4);

Et dans ta class :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
class log
{
       public $loglevel = NULL;
 
       public function __construct()
       {
              $this->loglevel = __DEBUG__ | __WARNING__;
       }
 
       public function check($flag)
       {
              return (bool)($this->loglevel & $flag);
       }
 
       public function add($flag)
       {
              $this->loglevel |= $flag;
       }
}
__________________
http://www.ape-project.org/
|PaRa-BoL est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 16h44   #10
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Citation:
Je ne comprend toujours pas pourquoi tu souhaites définir des variables statics dans une classe.
C'est parce que les fonctions de cette classe sont déclarées static.

Après, s'il est avéré qu'il n'est pas possible de définir en static des variables de classe à l'aide d'opérateurs, je vais revoir la conception de cette classe et utiliser le design pattern singleton.

Si je n'ai pas d'autres réponses d'ici Lundi, je fermerai ce post.

Merci à tout ceux qui ont répondu.
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 17h27   #11
Membre Expert
 
Inscription : janvier 2005
Messages : 2 288
Détails du profil
Informations forums :
Inscription : janvier 2005
Messages : 2 288
Points : 2 287
Points : 2 287
Pour répondre a Para|Bol, une variable statique dans une classe a un intéret car c'est une variable commune à toutes les instances de la classe. Ca permet par exemple de faire un compteur d'instance d'une classe donnée. Le nombre d'instances est déclaré en statique dans la classe et initialisé a 0, il est incrémenté a chaque fois dans le constructeur.

Dans ce cas particulier de l'utilisation des variables statiques (que tu décris comme des constantes et non plus comme des variables) les define sont surement plus appropriés.

Enfin, je ne crois pas que l'utilisation des variables de membre statique soit appliquable comme cela en PHP, d'apres la documentation, une instance de classe ne peut accéder directement a son membre déclaré statique, cf la documentation.
koopajah est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 18h24   #12
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Avec ce petit script :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
 
class TestStatic
{
    private static $static_var = "Si, si! C'est possible";
 
    function __construct() {
        echo "static_var dans constructeur : " . self::$static_var . "<br/>";
    }
 
    function test()
    {
        echo "static_var dans test() : " . self::$static_var;
    }
}
 
$testStatic = new TestStatic();
$testStatic->test();
?>
J'obtiens la sortie suivante :

static_var dans constructeur : Si, si! C'est possible
static_var dans test() : Si, si! C'est possible
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2008, 22h32   #13
Membre Expert
 
Inscription : janvier 2007
Messages : 1 452
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : janvier 2007
Messages : 1 452
Points : 1 914
Points : 1 914
Et sinon pourquoi ne fais tu pas comme cela ?

Code :
1
2
3
4
5
6
7
8
9
10
11
class Logger {
 
  const DEBUG   = 0001;
  const WARNING = 0002;
  const ERROR   = 0004;
  ...
 
  // J'ainerais faire qq chose du genre :
  static $logLevel = NULL;
}
Logger::$logLevel = Logger::DEBUG | Logger::ERROR;
C'est la même solution que j'ai présenté plus haut, adapté à ton problème, et j'avou ne pas comprendre pourquoi ne pas t'en servir. Car de toute manière la propriété static sera interprété au moment de l'interprétation, que tu l'initialise directement dans la la définition de la classe, ou juste après, cela ne change pas grand chose d'après l'exemple donné.

?

bye
kaymak est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2008, 11h39   #14
Invité régulier
 
Homme Aurélien B.
Ingénieur développement logiciels
Inscription : mai 2005
Messages : 21
Détails du profil
Informations personnelles :
Nom : Homme Aurélien B.
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Industrie

Informations forums :
Inscription : mai 2005
Messages : 21
Points : 9
Points : 9
Merci Kaymak, je vais faire comme ça.
AurélienB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h15.


 
 
 
 
Partenaires

Hébergement Web