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 08/02/2011, 21h10   #1
Candidat au titre de Membre du Club
 
Inscription : février 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 38
Points : 13
Points : 13
Par défaut Initialiser des variables hors constructeur

Bonsoir.

Je cherche à initialiser des variables, en dehors de tout constructeur, avec des valeurs d'autres variables.
Ainsi, je voudrais faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
<?php
class Constants {
	private static $varA = "hello wold";
	private static $varB = "bonjour le monde";
 
	public static $var1 = self::$varA;
	//public static $var1 = $varA;
	public static $var2 = self::$varA;
	public static $var3 = self::$varB;
}
?>
J'ai une erreur du type
Code :
Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING
ou
Code :
Parse error: syntax error, unexpected T_VARIABLE
(en fonction de la présence de self:: ou non).
Ainsi, je n'ai que la classe de constante à changer, pas les classes qui utilisent $var1, $var2 ou $var3.

Dans le même genre, j'aurais besoin de faire :

Code :
1
2
3
4
5
6
7
8
9
<?php
class Constants {
	public static $varA = "hello wold";
}
 
class Essai {
	private $myvar = Constants::$varA;
}
?>
Et rebelotte :
Code :
Parse error: syntax error, unexpected T_VARIABLE, expecting T_STRING
Quelle est la bonne syntaxe pour faire cela ?
sql_ignorant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 23h39   #2
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Bonjour,

commence par virer tes 2 private pour mettre public à la place
__________________
Je ne réponds pas aux questions envoyées par mp
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 09/02/2011, 08h05   #3
Membre chevronné
 
Inscription : mars 2005
Messages : 583
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 583
Points : 651
Points : 651
Hello,

Le pourquoi se trouve ici : http://fr.php.net/manual/fr/language...properties.php

Les valeurs par défaut ne peuvent être initialisées que par des littéraux ou des constantes.
Pour le reste il faudra passer par un constructeur ou des méthodes d'initialisation.
__________________
Pourfendeur de singletons en croisade
Petibidon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 16h19   #4
Candidat au titre de Membre du Club
 
Inscription : février 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 38
Points : 13
Points : 13
Arf, pas cool !
Autant pour la classe Essai, je peux définir explicitement un constructeur au lieu d'utiliser le constructeur implicite, autant je ne vois pas comment faire pour une classe de type Constants.
sql_ignorant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 18h05   #5
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut sql_ignorant,

Je ne vois pas l'intérêt d'avoir une classe Constants avec des variables déclarées static partout.
Si je suis ta logique ta classe ne devrait comporter que des constantes obligatoirement immutables alors que mettre des static var les rends mutables et elles perdent du coup leur sens Constants

Ensuite si tu codes sous PHP 5.3+ il te reste le Late Static Binding qui fait des merveille dans le cadre où tu aurais besoin d'initialiser "descriptivement" des variables qui peuvent être déclarées comme const ou static et résolues toutes par le même appel à static::

Enfin, je me suis coltiné ce genre de problème et le recours au LSB m'a permis d'y apporter une soluce propre.
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 22h15   #6
Candidat au titre de Membre du Club
 
Inscription : février 2009
Messages : 38
Détails du profil
Informations forums :
Inscription : février 2009
Messages : 38
Points : 13
Points : 13
L'intérêt ?

Confiner la portée d'une constante !

Ainsi, tu peux disposer de constante portant le même nom mais dont la portée est différente. Par exemple, la classe Constants1 peux contenir $name qui concerne l'objet1, et la classe Constants2 qui contient aussi $name mais qui concerne l'objet2.
Bien sûr, je pourrais nommer mes constantes objet1_name et objet2_name, mais pourquoi rester au modèle de programmation des années 70 quand on peut utiliser des concepts plus modernes ?

Quant à LSB, ne le connaissant pas, je serai ravi que tu m'en donnes plus d'explication.
sql_ignorant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2011, 23h05   #7
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Citation:
la classe Constants1 peux contenir $name qui concerne l'objet1, et la classe Constants2 qui contient aussi $name mais qui concerne l'objet2.
Personnellement, je metterai directement ces constantes dans l'objet1 et l'objet2. Tu confines la portée de la constante à l'objet concerné et de plus tu ne perds pas le rapport fonctionnel (voire sémantique) entre la constante et l'objet rattaché.

Pour le LSB un exemple vaut mieux qu'un long discours :
Code :
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
<?php
 
class Foo {
 
   const OPTION1 = 'a';
   const OPTION2 = 'b';
 
   static $staticVar = '1';
 
   # ici tu rappatries la valeur de OPTION1 de la classe enfant dans la classe parent
   # le code de la fonction est bien localisé dans la classe mère et s'exécute avec 
   # la valeur de la classe enfant !
   static function showOption1_LSB() {
      return static::OPTION1;
   }
 
   # ici tu rappatries la valeur de OPTION2 de la classe enfant dans la classe parent
   # OPTION2 n'est pas redéfinie dans la classe enfant donc la résolution s'arrête à la classe courante
   static function showOption2_LSB() {
      return static::OPTION2;
   }
 
   static function showOption1() {
      return self::OPTION1;
   }
 
   static function showOption2() {
      return self::OPTION2;
   }
 
   # ici tu rappatries la valeur de $staticVar de la classe enfant dans la classe parent
   # le code de la fonction est bien localisé dans la classe mère et s'exécute avec 
   # la valeur de la classe enfant !
   static function showStaticVar_LSB() {
      $v = static::$staticVar;
      return "Valeur de la variable statique résolue à la volée = $v";
   }
}
 
 
class Bar extends Foo {
   const OPTION1 = 'xyz';
   static $staticVar = '123456789';
}
 
 
echo 'LSB Option 1 = ', Bar::showOption1_LSB(), '<br />'; // affiche xyz (valeur localisée dans la classe enfant)
echo 'LSB Option 2 = ', Bar::showOption2_LSB(), '<br />'; // affiche b (valeur localisée dans la classe mère)
echo 'Option 1 = ', Bar::showOption1(), '<br />'; // affiche a (valeur localisée dans la classe mère)
echo 'Option 2 = ', Bar::showOption2(), '<br />'; // affiche b (valeur localisée dans la classe mère)
echo 'StaticVar = ', Bar::showStaticVar_LSB(), '<br />'; // affiche 123456789 (valeur localisée dans la classe enfant)
 
?>
L'intérêt principal du Late Static Binding est de factoriser et de loger le code des fonctions dans les classes mères (souvent abstract) et de l'exécuter avec les valeurs des classes enfants qui ne font que redéfinir juste des paramètres (constantes ou staticvar).
Je peux te garantir c'est très très pratique. Enfin une fois que tu y a goûté...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h07.


 
 
 
 
Partenaires

Hébergement Web