PHP POO Intermediário
Métodos e propriedades estáticos
Em PHP, membros estáticos pertencem à classe, não a objetos individuais. Você os acessa com :: e eles existem independentemente de instâncias. Propriedades estáticas são compartilhadas entre todos os objetos da classe, e métodos estáticos podem ser chamados sem instanciar a classe.
Dentro de uma classe, self:: refere-se à classe onde o código foi definido, enquanto static:: refere-se à classe que foi chamada em tempo de execução. Essa diferença é chamada de late static binding e permite que métodos estáticos respeitem a herança.
Métodos estáticos são úteis para fábricas (métodos que criam instâncias) e utilitários. Porém, eles não têm acesso a $this, pois não operam sobre um objeto específico. Use-os com moderação para manter o código testável e coeso.
Pontos-chave
- Membros estáticos pertencem à classe e são acessados com
::. self::refere-se à classe onde o método foi definido;static::à classe chamada em tempo de execução.- Late static binding permite que métodos estáticos sejam herdados e ainda usem a classe filha.
- Métodos estáticos não podem usar
$this. - Fábricas estáticas encapsulam a criação de objetos e podem retornar subtipos.
<?php
class Produto
{
// Propriedade estática compartilhada por todas as instâncias
public static int $contador = 0;
public function __construct(
public readonly string $nome,
public readonly float $preco
) {
self::$contador++; // incrementa o contador global da classe
}
// Método estático de fábrica: cria um produto a partir de um array
public static function fromArray(array $dados): static
{
// static:: permite que classes filhas retornem a si mesmas
return new static($dados['nome'], $dados['preco']);
}
public function descricao(): string
{
return "{$this->nome} custa R$ " . number_format($this->preco, 2, ',', '.');
}
}
class Livro extends Produto
{
public function __construct(string $nome, float $preco, public readonly string $autor)
{
parent::__construct($nome, $preco);
}
public function descricao(): string
{
return parent::descricao() . " por {$this->autor}";
}
}
// Usando a fábrica estática
$p = Produto::fromArray(['nome' => 'Caneta', 'preco' => 2.50]);
$l = Livro::fromArray(['nome' => 'PHP Moderno', 'preco' => 59.90, 'autor' => 'Ana']);
echo $p->descricao() . PHP_EOL;
echo $l->descricao() . PHP_EOL;
echo 'Total de produtos: ' . Produto::$contador . PHP_EOL;