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:

  1. Añadiendo protected static $count=0; a cada clase de derivadas
  2. Hacer $count no un número entero sino una matriz.Y hacer ese tipo de cosas en inc y getCount 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.

¿Fue útil?

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top