Liaison statique tardive en PHP, les variables sont partagées entre les classes enfants
-
12-12-2019 - |
Question
Ma question a peut-être été posée plusieurs fois, mais...
J'ai le code suivant
abstract class ParentClass
{
protected static $count=0;
public static function inc()
{
static::$count++;
}
public static function getCount()
{
return static::$count;
}
}
class FirstChild extends ParentClass
{
}
class SecondChild extends ParentClass
{
}
Et je l'utilise comme ça
FirstChild::inc();
echo SecondChild::getCount();
Il m'affiche "1".Et comme vous l'aurez probablement deviné, j'ai besoin de "0" :)
Je vois deux manières :
- Ajouter
protected static $count=0;
à chaque classe dérivée Faire
$count
pas un entier mais un tableau.Et faire ce genre de choses dansinc
etgetCount
méthodes :static::$count[get_call_class()]++;
et
return static::$count[get_called_class()];
Mais je pense que ces méthodes sont un peu laides.Premièrement, cela me fait copier/coller ce que j'aimerais éviter.Deuxièmement - eh bien, je ne sais pas :) Je n'aime tout simplement pas ça.
Existe-t-il une meilleure façon de réaliser ce que je veux ?
Merci d'avance.
La solution
Non, vous avez exactement présenté les deux options les plus pratiques pour résoudre ce problème.PHP ne peut pas faire de magie ;lorsque vous déclarez un static
protected
propriété, vous obtenez exactement cela : un propriété.Si la syntaxe que vous donnez fonctionnait, cela pourrait être une bonne nouvelle pour tous ceux qui ont besoin de le faire, mais ce serait une nouvelle absolument horrible pour tous ceux qui s'attendent à ce que PHP OOP se comporte d'une manière quelque peu sensée.
Et pour mémoire, si vous n'avez pas besoin d'un compteur séparé pour toutes les classes dérivées sans exception, je considère l'explicite protected static $count = 0
dans les classes dérivées qui en ont besoin pour être une belle solution :vous voulez votre propre compteur, vous en demandez un, et ce fait reste écrit dans le code pour que tout le monde puisse le voir.
Autres conseils
Je pense que pour ce que vous essayez de faire, avoir juste une méthode d'interface (telle que getCount()) dans la classe abstraite et le compteur dans la classe dérivée, votre premier choix, est la moins pire des options.Cela n'a pas de sens d'avoir un nombre statique abstrait dans la classe parent si vous ne comptez pas toutes les instances pour ce nombre.
En général, je pense que l'idée est un peu moche, donc les implémentations seraient également laides :)
Vous pouvez déclarer protected static $count=0;pour chaque classe enfant, de cette façon, il sera unique pour chaque classe enfant mais commun à toutes les instances des classes.C'est la solution la plus élégante à son problème.
abstract class ParentClass
{
public static function inc()
{
static::$count++;
}
public static function getCount()
{
return static::$count;
}
}
class FirstChild extends ParentClass
{
protected static $count=0;
}
class SecondChild extends ParentClass
{
protected static $count=0;
}