W3docs

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; // 3

Três coisas tornam uma propriedade estática diferente de uma comum:

  • Acessada via a classe, não por um objeto. Você escreve User::$count com 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::$count dentro da classe. Dentro de um método, você acessa a propriedade por meio de self::, static:: ou parent:: — 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; // 12

Uma 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(); // Child

Use 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::$count acima 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::$defaultRole global.
  • 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 const para 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 $this em um contexto estático. Métodos estáticos não têm $this, portanto uma propriedade estática deve ser acessada com self::, static:: ou parent::.
  • 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 Child faz 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.

Prática

Prática
O que é correto sobre propriedades estáticas no PHP de acordo com o conteúdo da URL especificada?
O que é correto sobre propriedades estáticas no PHP de acordo com o conteúdo da URL especificada?
Was this page helpful?