Domanda

Forse la mia domanda è stata posta più volte, ma...

Ho il seguente codice

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
{

}

E lo uso proprio così

FirstChild::inc();
echo SecondChild::getCount();

Mi mostra "1".E come probabilmente indovini ho bisogno di "0":)

Vedo due modi:

  1. Aggiungere protected static $count=0; per ogni classe derivata
  2. Fare $count non intero ma array.E fare una sorta di cose del genere in inc e getCount metodo:

    static:: count count [get_called_class ()]++;

e

return static::$count[get_called_class()];

Ma penso che questi modi siano un po ' brutti.In primo luogo-mi fa copiare/incollare, quello che mi piacerebbe evitare.Secondo-beh, non lo so:) Non mi piace.

C'è un modo migliore per ottenere ciò che voglio?

grazie in anticipo.

È stato utile?

Soluzione

No, hai esattamente definito le due opzioni più pratiche per affrontare questo problema.PHP non può funzionare magicamente;quando si dichiara un static protected proprietà si ottiene esattamente questo: una proprieta.Se la sintassi fornita funzionasse, potrebbe essere una buona notizia per tutti coloro che hanno bisogno di farlo, ma sarebbe una notizia assolutamente orribile per tutti gli altri che si aspettano che PHP OOP si comporti in modo un po ' sano di mente.

E per la cronaca, se non hai bisogno di un contatore separato per tutte le classi derivate senza eccezioni, considero l'esplicito protected static $count = 0 nelle classi derivate che ne hanno bisogno per essere una bella soluzione:vuoi il tuo contatore, ne chiedi uno, e questo fatto rimane scritto nel codice per tutti da vedere.

Altri suggerimenti

Penso che per quello che stai cercando di fare, avere solo un metodo di interfaccia (come getCount()) nella classe astratta e il contatore nella classe derivata, la tua prima scelta, è l'opzione meno peggiore.Non ha senso avere un conteggio statico astratto nella classe padre se non si contano tutte le istanze per quel conteggio.

In generale, penso che l'intera idea sia un po ' brutta, quindi anche le implementazioni sarebbero brutte:)

È possibile dichiarare statico protetto count count = 0;per ogni classe figlio, in questo modo sarà unico per ogni classe figlio ma comune per tutte le istanze delle classi.Questa è la soluzione più elegante al suo problema.

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top