|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre à l'essai
![]() Inscription : mars 2008 Messages : 48 ![]() |
Bonjour.
mon probleme est le suivant: une méthode statique définie dans une classe abstraite utilise une propriété définie dans la classe concrète qui l'implémente. (PHP 5.2.6 sur le serveur) ex. de code ne fonctionnant pas: Code :
Code :
var_dump(Normalizer_GameInfo::normalize("juju")); Fatal error: Access to undeclared static property: Normalizer::$a_convert in C:\www\test.php on line 9 Comment faire? Merci d'avance pour votre aide. |
||
|
|
00
|
|
|
#2 |
![]() ![]() Gérard ErnaelstenDBA & Dev PHP Inscription : juin 2005 Messages : 3 174 ![]() |
Dans ta classe abstraite, tu ne définis pas en static $a_convert, en fait tu ne le définis pas du tout
Une classe mère, ne connais pas les attributs d'une classe fille !
__________________
Il faut toujours viser la lune, car même en cas d'échec on arrive dans les étoiles. O.Wilde Mes Articles/Critiques : Merise - Guide pratique PHPExcel PostgreSQL : Administration et exploitation d'une base de données PostgreSQL : Entraînez-vous à créer et programmer une base de données relationnelle |
|
|
00
|
|
|
#3 |
|
Membre à l'essai
![]() Inscription : mars 2008 Messages : 48 ![]() |
Certes, mais la méthode normalize est commune à toutes les classes concrète (c'est pourquoi je la défini dans la classe abstraite, pour ne pas dupliquer le code). Par contre, $a_convert est spécifique à chaque classe concrète.
A la lumière de ces données (méthode identique, propriété différente), comment coder ça proprement? Merci d'avance. |
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() ![]() |
Salut danidan75,
Bon c'est simple ce que tu veux faire est impossible avant PHP 5.3. Je t'invite à regarder du côté du LSB : Late Static Binding. Cette fonctionnalité te permet de remonter les valeurs de variables statiques définies dans des classes dérivées à des classes parentes. Très pratique dans le cadre d'un Framework, enfin dans ma boite on utilise ceci massivement En PHP 5.3 cela donnerait dans ton cas : Ici, à l'exécution du code de la classe mère (abstract dans ton cas) le moteur du PHP irait chercher la valeur statique de ta variable là où elle est définie et la ramenerait dans le corps de la fonction de la classe parente. Bon si tu ne peux pas passer sous une version récente du PHP, tu peux contourner cette limitation en modifiant légèrement ton interface. Au lieu d'avoir une variable, il te faudrait transformer $a_convert en a_convert(). Espérant avoir été assez clair à miniuit. |
|
00
|
|
|
#5 | ||
![]() ![]() Gérard ErnaelstenDBA & Dev PHP Inscription : juin 2005 Messages : 3 174 ![]() |
Je confirme que ceci en 5.3 fonctionne
Code :
__________________
Il faut toujours viser la lune, car même en cas d'échec on arrive dans les étoiles. O.Wilde Mes Articles/Critiques : Merise - Guide pratique PHPExcel PostgreSQL : Administration et exploitation d'une base de données PostgreSQL : Entraînez-vous à créer et programmer une base de données relationnelle |
||
|
|
00
|
|
|
#6 | ||
|
Membre à l'essai
![]() Inscription : mars 2008 Messages : 48 ![]() |
Une subtilité doit m'échapper
Comme proposé, je suis passé par un getter, et le nouveau code est Code :
Code :
Fatal error: Cannot call abstract method INormalizer::getConvertArray() in C:\www\test.php on line 10 |
||
|
|
00
|
|
|
#7 | ||
|
Expert Confirmé
![]() ![]() |
Bonjour,
Autant pour moi, je n'ai pas suffisamment été clair, désolé. Oui j'aurais dû te dire que hors de PHP 5.3, il t'est impossible de traiter ce cas de figure dans le monde static. Pour y arriver en 5.2 et en faisant simple tu n'as pas le choix que de passer par le polymorphisme ou comme le dis MaitrePylos en utilisant le getter/setter mais dans ce cas cela va alourdir légèrement le code. Qui dit getter/setter dit instance et donc bye bye le monde static. Code :
|
||
|
00
|
|
|
#8 | ||
|
Membre à l'essai
![]() Inscription : mars 2008 Messages : 48 ![]() |
Effectivement, Xysio, à un moment, je m'étais demandé si la fonction a_convert dont tu me parlais était hors classe, et donc accessibles de partout.
Au final, s'il est impossible de passer par une methode statique, je prends Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com