Enlace estático tardío en PHP, las variables se comparten entre clases secundarias
-
12-12-2019 - |
Pregunta
Quizás mi pregunta se haya hecho varias veces, pero...
Tengo el siguiente código
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
{
}
Y lo uso así
FirstChild::inc();
echo SecondChild::getCount();
Me muestra "1".Y como probablemente adivinarás, necesito "0" :)
Veo dos maneras:
- Añadiendo
protected static $count=0;
a cada clase de derivadas Hacer
$count
no un número entero sino una matriz.Y hacer ese tipo de cosas eninc
ygetCount
métodos:estático::$count[get_call_class()]++;
y
return static::$count[get_called_class()];
Pero creo que estas formas son un poco feas.Primero, me hace copiar y pegar, lo que me gustaría evitar.Segundo, bueno, no lo sé :) Simplemente no me gusta.
¿Existe una mejor manera de lograr lo que quiero?
gracias de antemano.
Solución
No, usted ha expuesto exactamente las dos opciones más prácticas para solucionar este problema.PHP no puede hacer magia;cuando declaras un static
protected
propiedad obtienes exactamente eso: uno propiedad.Si la sintaxis que usted proporciona funcionó, podría ser una buena noticia para todos los que necesitan hacerlo, pero sería una noticia absolutamente horrible para todos los que esperan que PHP OOP se comporte de una manera algo sensata.
Y para que conste, si no necesita un contador separado para todas las clases derivadas sin excepción, entonces considero el explícito protected static $count = 0
en clases derivadas que sí necesitan una para ser una solución hermosa:quieres tu propio contador, lo pides y ese hecho queda escrito en el código para que todos lo vean.
Otros consejos
Creo que para lo que intentas hacer, tener solo un método de interfaz (como getCount()) en la clase abstracta y el contador en la clase derivada, tu primera opción, es la peor opción.No tiene sentido tener un recuento estático abstracto en la clase principal si no cuentas todas las instancias para ese recuento.
En general, creo que toda la idea es un poco fea, por lo que las implementaciones también lo serían :)
Puede declarar protected static $count=0;para cada clase secundaria, de esa manera será único para cada clase secundaria pero común para todas las instancias de las clases.Ésa es la solución más elegante a su 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;
}