abstract
Em PHP, a palavra-chave abstract define classes e métodos abstratos. Uma classe abstrata não pode ser instanciada e é projetada para ser estendida.
A Palavra-chave abstract em PHP
A palavra-chave abstract marca uma classe ou método como incompleto por intenção. Uma classe abstrata define uma forma comum e comportamento compartilhado, mas não pode ser transformada em um objeto por si só — ela existe para ser estendida. Um método abstrato declara a assinatura de um método sem corpo, forçando toda subclasse concreta a fornecer a implementação real.
Esta página aborda o que são classes e métodos abstratos, como declará-los, as regras que PHP impõe e quando usar abstract é a escolha de design correta.
O que é uma Classe Abstrata?
Uma classe abstrata é uma classe que não pode ser instanciada diretamente. Ela deve ser estendida por outras classes que preenchem as partes ausentes. Uma classe abstrata pode misturar dois tipos de membros:
- Métodos abstratos — declarados mas não implementados, deixando o trabalho para as subclasses.
- Métodos e propriedades concretos — totalmente implementados e herdados como estão, de modo que a lógica compartilhada fica em um único lugar.
A regra é unidirecional: uma classe com pelo menos um método abstrato deve ser declarada abstract. O inverso não é obrigatório — uma classe pode ser abstrata sem ter nenhum método abstrato, simplesmente para impedir que seja instanciada.
<?php
abstract class Animal {
// Concrete method — inherited by every subclass unchanged
public function describe(): string {
return "I am a " . static::class . " and I say " . $this->makeSound();
}
// Abstract method — each subclass must implement it
abstract public function makeSound(): string;
}O que é um Método Abstrato?
Um método abstrato é declarado com a palavra-chave abstract, não possui corpo e termina com ponto e vírgula em vez de { ... }. Sua função é definir um contrato: qualquer subclasse que queira ser concreta deve fornecer uma implementação compatível.
<?php
abstract public function makeSound(): string; // signature only, no bodyUma subclasse deve manter o método compatível com a declaração abstrata — os mesmos parâmetros (ou compatíveis) e uma visibilidade igual ou menos restritiva que a original.
Como Definir uma Classe e um Método Abstratos
Coloque abstract antes de class para tornar a classe abstrata, e antes de function para tornar um método abstrato. Veja o padrão completo — uma classe base com um método compartilhado e um método abstrato, mais duas subclasses concretas:
<?php
abstract class Animal {
public function describe(): string {
return static::class . " says " . $this->makeSound();
}
abstract public function makeSound(): string;
}
class Dog extends Animal {
public function makeSound(): string {
return "Woof!";
}
}
class Cat extends Animal {
public function makeSound(): string {
return "Meow!";
}
}
echo (new Dog())->describe(), "\n"; // Dog says Woof!
echo (new Cat())->describe(), "\n"; // Cat says Meow!Cada subclasse implementa makeSound() e herda describe() gratuitamente — esse método compartilhado é exatamente o motivo pelo qual uma classe base abstrata é mais útil do que uma simples interface aqui.
O que Acontece ao Instanciar uma Classe Abstrata?
Tentar criar um objeto a partir de uma classe abstrata resulta em erro fatal, detectado em tempo de compilação:
<?php
abstract class Animal {
abstract public function makeSound(): string;
}
$a = new Animal();
// Fatal error: Cannot instantiate abstract class AnimalO mesmo erro ocorre se uma subclasse se esquece de implementar um método abstrato herdado — PHP trata essa subclasse como ainda abstrata.
Regras e Armadilhas
- Uma classe com qualquer método abstrato deve ser declarada
abstract. - Métodos abstratos não podem ser
private— as subclasses não conseguiriam vê-los para sobrescrevê-los. Usepublicouprotected. - Métodos abstratos não podem ser
final(eles são destinados a ser sobrescritos) e, desde PHP 8.0, não devem serstaticde forma que permita sobrescrita significativa — prefira métodos abstratos de instância. - Uma classe abstrata pode ter um construtor; as subclasses o chamam com
parent::__construct(). - Uma subclasse que não implementa todos os métodos abstratos herdados deve ela própria ser declarada
abstract.
Classe Abstrata vs Interface
Ambas definem um contrato, mas respondem a perguntas diferentes:
- Uma classe abstrata ("é um") pode conter métodos concretos, propriedades e construtores. Uma classe pode estender apenas uma classe abstrata.
- Uma interface ("pode fazer") declara apenas assinaturas de métodos (sem implementação, sem estado de instância) e uma classe pode implementar muitas interfaces.
Use uma classe abstrata quando as subclasses compartilham implementação real; use uma interface quando você só precisa garantir uma capacidade. Veja PHP Inheritance e PHP Interfaces para mais informações.
Conclusão
A palavra-chave abstract permite definir um projeto parcial: uma classe abstrata fornece comportamento compartilhado enquanto declara métodos abstratos que toda subclasse concreta deve implementar. Não é possível instanciar uma classe abstrata diretamente — esse é o objetivo. Use-a quando várias classes relacionadas compartilham lógica, mas cada uma precisa personalizar etapas específicas, e escolha uma interface quando nenhuma implementação compartilhada estiver envolvida.