Compreendendo Propriedades Estáticas na POO do PHP
Aprenda o que são propriedades estáticas no PHP, como declará-las, acessá-las e usá-las com herança e late static binding.
Uma propriedade estática pertence à própria classe, e não a nenhum objeto individual criado a partir dela. Enquanto uma propriedade regular (de instância) recebe sua própria cópia em cada objeto, uma propriedade estática existe exatamente uma vez e é compartilhada por todas as instâncias — altere-a em um lugar e todas as instâncias verão o novo valor. Esta página explica como declarar propriedades estáticas, como lê-las e escrevê-las, como self, static e parent diferem entre si, como elas se comportam com herança e os pontos de atenção a observar.
Se você é novo em classes PHP, comece com Classes e Objetos PHP primeiro.
O que é uma propriedade estática?
Você declara uma propriedade estática com a palavra-chave static, combinada com um modificador de visibilidade (public, protected ou private):
<?php
class User {
public static int $count = 0;
public function __construct() {
self::$count++;
}
}
new User();
new User();
new User();
echo User::$count; // 3Três coisas tornam uma propriedade estática diferente de uma comum:
- Acessada via a classe, não por um objeto. Você escreve
User::$countcom o operador de resolução de escopo::, não$user->count. Tentar ler uma propriedade estática por meio do operador de seta ($user->count) não funciona e emite um aviso. - Compartilhada, não copiada. Cada
new User()incrementa o mesmo$count. Há apenas uma cópia na memória para toda a classe. - Referenciada como
self::$countdentro da classe. Dentro de um método, você acessa a propriedade por meio deself::,static::ouparent::— nunca$this.
Lendo e escrevendo uma propriedade estática
De dentro da classe, use self::$property. De fora, use ClassName::$property. Como há apenas uma cópia, uma escrita em qualquer contexto é visível em todo lugar:
<?php
class Counter {
public static int $value = 0;
public static function increment(): void {
self::$value++;
}
}
Counter::increment();
Counter::increment();
Counter::$value += 10; // also writable directly from outside
echo Counter::$value; // 12Uma propriedade estática pode ter um valor padrão, mas esse padrão deve ser uma expressão constante (um literal, uma constante ou uma expressão aritmética simples com const) — não pode ser o resultado de uma chamada de função ou de um objeto new.
self:: vs static:: (late static binding)
Dentro de um método, você pode acessar uma propriedade estática com self:: ou static::. Eles diferem quando há herança envolvida:
self::é resolvido em tempo de compilação e sempre aponta para a classe onde o código foi escrito.static::usa late static binding — aponta para a classe em que o método foi chamado em tempo de execução.
<?php
class Base {
public static string $label = "Base";
public static function whoAmISelf(): string {
return self::$label; // bound to Base
}
public static function whoAmIStatic(): string {
return static::$label; // bound to the calling class
}
}
class Child extends Base {
public static string $label = "Child";
}
echo Child::whoAmISelf(); // Base
echo "\n";
echo Child::whoAmIStatic(); // ChildUse static:: quando quiser que subclasses substituam o valor; use self:: quando o valor deve permanecer vinculado à classe que o declara. Veja Métodos Estáticos PHP para mais informações sobre como chamar membros estáticos.
Quando usar propriedades estáticas?
Propriedades estáticas são ideais quando um estado precisa ser compartilhado por todas as instâncias de uma classe:
- Contagem de instâncias — o exemplo
User::$countacima rastreia quantos objetos existem. - Cache / registros — armazene uma tabela de pesquisa ou um recurso compartilhado único (por exemplo, um handle de conexão com banco de dados) para que seja criado uma vez e reutilizado.
- Configuração ou flags — um padrão que se aplica a toda a classe, como um
User::$defaultRoleglobal. - O padrão Singleton — uma propriedade estática privada mantém a instância única retornada por
getInstance().
Se o valor nunca deve mudar após a declaração, prefira uma constante de classe (const) — ela expressa a intenção melhor e não pode ser reatribuída.
Pontos de atenção comuns
- Propriedades estáticas não são constantes. Elas são mutáveis; qualquer código com acesso pode reatribuí-las. Use
constpara valores que não devem mudar. - Estado compartilhado é uma faca de dois gumes. Como todas as instâncias compartilham o valor, uma alteração em um objeto aparece em todo lugar — conveniente para contadores, perigoso se você esperava dados por objeto.
- Sem
$thisem um contexto estático. Métodos estáticos não têm$this, portanto uma propriedade estática deve ser acessada comself::,static::ouparent::. - A herança compartilha o armazenamento do pai, a menos que seja redeclarada. Uma subclasse que não redeclara uma propriedade estática compartilha a cópia única do pai; redeclará-la (como
Childfaz acima) dá à subclasse a sua própria.
Conclusão
Propriedades estáticas permitem que uma classe mantenha um estado compartilhado por todas as suas instâncias, acessado pelo nome da classe com o operador :: e por meio de self::/static:: dentro da classe. Elas são ideais para contadores, caches, registros e singletons. Use uma const de classe quando o valor deve permanecer fixo, e lembre-se de que static:: habilita o late static binding para que subclasses possam substituir o valor. Em seguida, explore Métodos Estáticos PHP e Herança PHP para ver como essas peças se encaixam.