Ligação estática tardia em PHP, vars estão sendo compartilhados entre classes filhas
-
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:
- Adicionando
protected static $count=0;
para cada classe de derivativos Fazer
$count
não inteiro, mas array.E fazer esse tipo de coisa eminc
egetCount
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.
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;
}