Da trilha de PHP Este conceito ainda não saiu como card do dia. ir para o card de hoje

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.
static_factory.php
<?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;

Exercícios

  1. 1
    Fácil

    Contador de instâncias

    Crie uma classe Contador com uma propriedade estática $total que começa em 0. Cada vez que um objeto é criado, $total deve ser incrementado. No final, exiba o total de objetos criados.

    Resolver
  2. 2
    Médio

    Fábrica estática com late static binding

    Crie uma classe Documento com propriedades titulo e tipo. Adicione um método estático criar que recebe um array e retorna uma nova instância usando static::. Em seguida, crie a classe Relatorio que estende Documento e adiciona a propriedade periodo. Use Documento::criar e Relatorio::criar para criar objetos e exiba seus dados.

    Resolver
  3. 3
    Desafio

    Registro de classes com fábrica e contador

    Crie uma classe abstrata Animal com uma propriedade estática $total e um método estático criar que recebe um array com tipo e outros dados. O método deve usar static:: para instanciar a classe correta (Cachorro ou Gato) com base no tipo. Cada classe filha deve ter seu próprio construtor. O contador $total deve ser incrementado a cada criação. Exiba o total e os dados dos animais criados.

    Resolver

Continue estudando