Constante de classe à récupérer dans la classe parente [Résolu]

rekam 122 Messages postés mardi 19 novembre 2002Date d'inscription 10 mars 2011 Dernière intervention - 27 janv. 2008 à 19:42 - Dernière réponse : cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention
- 28 janv. 2008 à 13:55
Bonjour!

oui, je sais, le titre fait 3km de long, mais j'ai de la peine à le raccourcir...

Ainsi donc, voici mon problème:
1) J'ai 2 classe A et B
2) La classe B étend la classe A
3) La classe A définit une méthode statique A::chose()
4) La classe B définit une constante ou une propriété statique B::$test
5) je voudrais afficher la constante ou propriété statique définie dans B dans la méthode de A
Et évidemment, j'y arrive pas. En définissant "const test 'truc';" ou "public static $test 'truc';", j'obtiens un "not defined" dans la méthode de A.

Le code est celui-ci (copiez-collez, vous verrez bien)

class A {
    public static $test = 'truc A';
    public static function chose () {
        echo "voila : ".self::$test;
    }
}
class B extends A {
    public static $test = 'truc B';
}
B::chose();

Là, il me crache la valeur de $test définie dans A. Donc, bêtement, je commente la déclaration dans A, et là, pouf, "undefined static var...." qu'il me dit, le mécréant!

Alors bon, je tente le coup avec un petit "const test = 'truc B'" en lieu et place de la variable statique, mais non... même problème. Est-ce qu'il y a moyen de faire fonctionner ce binz? Est-ce que ce cas de figure est totalement débile? Je n'ai pas l'impression, pourtant. Je souhaite simplement pouvoir savoir, dans A, que l'appel à la méthode statique vient de B...

Bref si qqun m'a compris, je lui dis "bravo!".

Et si en plus, ce qqun a une solution, alors là, c'est champion du monde.

Bien la bonne soirée!
rekam
Afficher la suite 

7 réponses

Répondre au sujet
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 27 janv. 2008 à 22:43
+3
Utile
Hello,

http://www.php.net/manual/en/language.oop5.late-static-bindings.php
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de malalam
cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention - 27 janv. 2008 à 20:53
0
Utile
Hello,

Tout d'abord, attention à ne pas confondre constante de classe et propriété :

Tu peux définir une constante de classe de la manière suivante
class A{
    const CONST = "test";
}

Ensuite, en ce qui concerne ton problème, tu dois surcharger la méthode "chose" dans la classe B...
En fait le problème vient du fait que le mot clé "self" fait référence à la classe courante.... Donc dans ton exemple il fait toujours référence à la classe A

Voilà, avoir été clair ;-)
Bye

http://www.mytravellingfriend.com/tf_morpheus
Commenter la réponse de cs_morpheus57
rekam 122 Messages postés mardi 19 novembre 2002Date d'inscription 10 mars 2011 Dernière intervention - 27 janv. 2008 à 21:18
0
Utile
merci bien!

je m'en doutais et en fait... c'est triste. Parce qu'en fait, j'essaie précisément d'éviter de surcharger les fonctions. D'autant que la méthode A::chose() va contenir une sacrée quantité de choses, justement.

Donc bon, à moins d'avoir une de ces superbes constantes magiques PHPesque (telle __METHOD__ ), je ne vois pas trop comment faire... D'ailleurs, je viens d'essayer avec "method_exists", mais forcément, ça marche pas non plus, puisqu'il faut faire appel à self...

Snif... donc à moins de tout redéfinir la méthode, c'est pas possible, si j'ai bien compris?

merci
rekam
Commenter la réponse de rekam
rekam 122 Messages postés mardi 19 novembre 2002Date d'inscription 10 mars 2011 Dernière intervention - 27 janv. 2008 à 21:18
0
Utile
merci bien!

je m'en doutais et en fait... c'est triste. Parce qu'en fait, j'essaie précisément d'éviter de surcharger les fonctions. D'autant que la méthode A::chose() va contenir une sacrée quantité de choses, justement.

Donc bon, à moins d'avoir une de ces superbes constantes magiques PHPesque (telle __METHOD__ ), je ne vois pas trop comment faire... D'ailleurs, je viens d'essayer avec "method_exists", mais forcément, ça marche pas non plus, puisqu'il faut faire appel à self...

Snif... donc à moins de tout redéfinir la méthode, c'est pas possible, si j'ai bien compris?

merci
rekam
Commenter la réponse de rekam
rekam 122 Messages postés mardi 19 novembre 2002Date d'inscription 10 mars 2011 Dernière intervention - 27 janv. 2008 à 23:36
0
Utile
alors là, chapeau, c'est pile poil ce qu'il faut!

je dois juste recompiler mon php linux pour matcher la version 5.3.0, sinon ça va pas marcher (d'ailleurs ça ne marche pas, visiblement, puisqu'un copier-coller me fait une parse error ;) .. j'ai php 5.2.3, donc forcément).

bref, merci. En tous les cas, malalam, tes posts sur les forums sont tout autant pertinents que tes sources et tutoriaux!

a+
rekam
Commenter la réponse de rekam
malalam 10918 Messages postés lundi 24 février 2003Date d'inscription 2 mars 2010 Dernière intervention - 28 janv. 2008 à 08:25
0
Utile
:-)
Merci rekam!
En fait, ta question tombait pile poil : c'est un comportement de php qui m'emm*** depuis longtemps. Et je suis tombé sur cette nouvelle fonctionnalitée OO il y a peu.
Et j'insiste au passage sur la necessité d'au moins consulter la doc version anglaise régulièrement parce que la version française a toujours beaucoup de retard dessus.
Commenter la réponse de malalam
cs_morpheus57 122 Messages postés vendredi 31 mars 2006Date d'inscription 30 décembre 2010 Dernière intervention - 28 janv. 2008 à 13:55
0
Utile
Ah ben merci malalam : c'est vrai que c'était un comportement de PHP qui n'était pas terrible

http://www.mytravellingfriend.com/tf_morpheus
Commenter la réponse de cs_morpheus57

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.