W3docs

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 body

Uma 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 Animal

O 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. Use public ou protected.
  • Métodos abstratos não podem ser final (eles são destinados a ser sobrescritos) e, desde PHP 8.0, não devem ser static de 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.

Prática

Prática
Quais são as regras sobre classes e métodos abstratos em PHP conforme explicado no w3docs.com?
Quais são as regras sobre classes e métodos abstratos em PHP conforme explicado no w3docs.com?
Was this page helpful?