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 :

  1. Ajouter protected static $count=0; à chaque classe dérivée
  2. Faire $count pas un entier mais un tableau.Et faire ce genre de choses dans inc et getCount 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.

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top