Variables statiques PHP dans une classe parent abstraite: la question est dans l'exemple de code!
Rapide de code avec la question:
abstract class ClassParent {
public static $var1 = "ClassParent";
}
class ClassChild1 extends ClassParent{
public static function setvar1(){
ClassChild1::$var1 = "ClassChild1";
}
}
class ClassChild2 extends ClassParent{
public static function setvar1(){
ClassChild2::$var1 = "ClassChild2";
}
}
ClassChild1::setvar1();
echo ClassChild2::$var1;
//Returns "ClassChild1". Shouldn't this still be "ClassParent"?
Je suis en supposant que ce comportement est normal et pas un bogue de PHP. Dans ce cas, comment pourrais-je déclarer une variable statique dans la classe parente, qui seront traitées séparément pour les classes enfant. En d'autres termes, je veux séparer les valeurs statiques PAR ENFANT de la CLASSE. Dois-je déclarer la variable statique spécifiquement dans les classes enfant ou est-il peut-être une autre façon?
Merci!
source d'informationauteur Aron
Vous devez vous connecter pour publier un commentaire.
EDIT: Sur la poursuite de l'enquête, je pense que ce que vous demandez n'est pas possible directement, même avec la fin de la statique de la liaison. En fait, je suis un peu surpris.
La réponse à cette question fournit quelques solutions de contournement.
Réponse originale à cette question:
Dans une classe parent, si vous vous référez à une variable statique de la forme:
Il va utiliser la même variable dans toutes les classes héritées (donc toutes les classes enfant sera toujours accéder à la variable dans la classe parent).
C'est parce que la liaison de la
self
mot-clé est fait à la compilation, pas au moment de l'exécution.Depuis PHP 5.3, PHP supporte les late static binding à l'aide de la
static
mot-clé. Donc, dans vos classes, se reporter à la variable avec:Et "statique" est résolu à l'enfant de la classe au moment de l'exécution, alors il y aura une distinct variable statique pour chaque enfant de la classe.
Merci pour cette question! J'ai eu quelques problèmes, je ne pouvais pas suivre, et cela m'a aidé à les résoudre. 🙂
Vous pourriez être intéressés de savoir qu'il y a un rapport de bug pour ce comportement, qui comprend la solution de contournement. Dans votre cas, ce serait:
Laid comme l'enfer, je suis d'accord - mais PHP fonctionne comme prévu cette manière, en plus il n'a pas d'effets secondaires.
C'est en effet une très douteux (et mal documentés) "fonction" dans mes yeux - espérons qu'ils changent un jour.