Late static binding in PHP, i var vengono condivisi tra classi figlio
-
12-12-2019 - |
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:
- Aggiungere
protected static $count=0;
per ogni classe derivata Fare
$count
non intero ma array.E fare una sorta di cose del genere ininc
egetCount
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.
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;
}