Ligação estática tardia em PHP, vars estão sendo compartilhados entre classes filhas

StackOverflow https://stackoverflow.com//questions/12690019

  •  12-12-2019
  •  | 
  •  

Pergunta

Talvez minha pergunta tenha sido feita várias vezes, mas...

eu tenho o seguinte 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
{

}

E eu uso assim

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

Isso me mostra "1".E como você provavelmente adivinha, preciso de "0" :)

Vejo duas maneiras:

  1. Adicionando protected static $count=0; para cada classe de derivativos
  2. Fazer $count não inteiro, mas array.E fazer esse tipo de coisa em inc e getCount métodos:

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

e

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

Mas acho que essas formas são um pouco feias.Primeiro - me faz copiar/colar, o que eu gostaria de evitar.Segundo - bem, não sei :) simplesmente não gosto disso.

Existe uma maneira melhor de conseguir o que eu quero?

desde já, obrigado.

Foi útil?

Solução

Não, você expôs exatamente as duas opções mais práticas para resolver isso.PHP não pode fazer mágica;quando você declara um static protected propriedade você obtém exatamente isso: um propriedade.Se a sintaxe que você forneceu funcionou, isso pode ser uma boa notícia para todos que precisam fazer isso, mas seria uma notícia absolutamente horrível para todos os outros que esperam que o PHP OOP se comporte de maneira um tanto sensata.

E, para constar, se você não precisa de um contador separado para todas as classes derivadas, sem exceção, considero o explícito protected static $count = 0 em classes derivadas que precisam de uma para ser uma solução bonita:você quer seu próprio contador, você pede um, e esse fato permanece escrito no código para que todos possam ver.

Outras dicas

Acho que para o que você está tentando fazer, ter apenas um método de interface (como getCount()) na classe abstrata e o contador na classe derivada, sua primeira escolha, é a menos pior opção.Não faz sentido ter uma contagem estática abstrata na classe pai se você não estiver contando todas as instâncias dessa contagem.

Em geral, acho que a ideia toda é um pouco feia, portanto as implementações também seriam feias :)

Você pode declarar protected static $count=0;para cada classe filha, dessa forma será único para cada classe filha, mas comum para todas as instâncias das classes.Essa é a solução mais elegante para o seu 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top