Menu

Classe abstrata em PHP: métodos abstratos e quando usar

Uma classe abstrata PHP é declarada abstract class Name e não pode ser instanciada: ela existe para ser estendida. Pode ter propriedades, um construtor e métodos prontos, mais métodos abstract sem corpo que toda classe filha precisa implementar.

Esta página tem editores executáveis - edite, execute e veja a saída na hora.

Uma classe abstrata PHP é declarada com abstract class Name e não pode ser criada com new. Ela é uma base para outras classes: pode ter propriedades, um construtor e métodos prontos, mais métodos abstract sem corpo, que toda classe filha precisa implementar.

describe() é escrito uma vez em Shape e chama area(), que cada filha fornece. A classe abstrata garante que o método existe, então describe() pode confiar nele.

Não dá para criar uma classe abstrata com new

Uma classe abstrata é incompleta de propósito: Shape::area() não tem corpo, então um objeto Shape simples não teria nada para executar. O PHP se recusa a criar um e lança um Error:

Métodos abstratos: as regras

Um método abstrato tem uma assinatura e um ponto e vírgula no lugar do corpo. Cada filha precisa implementá-lo com uma assinatura compatível e a mesma visibilidade ou uma mais ampla: um método abstract protected pode virar protected ou public na filha, nunca private. Uma classe com um único método abstrato que seja precisa ela mesma ser declarada abstrata.

Uma filha que pula um método abstrato interrompe o script antes de qualquer parte dele rodar, a menos que a filha também seja declarada abstrata e deixe o método para as próprias filhas:

PHP Fatal error:  Class Square contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Shape::area) in /home/index.php on line 3

O padrão template method

O motivo mais comum para escrever uma classe abstrata: uma sequência fixa de passos em que alguns passos mudam. A classe base é dona da sequência num método final, e as filhas preenchem os passos. Aqui o mesmo relatório sai como texto puro e como tabela HTML:

Rode e a aba Page mostra a tabela HTML acima da versão em texto puro. open() e close() têm corpo padrão, então só HtmlReport se dá ao trabalho de sobrescrevê-los; row() é abstrato porque não existe um padrão razoável. Tornar render() final impede que uma filha mude a ordem dos passos.

Uma classe abstrata pode implementar uma interface

Uma classe abstrata pode declarar implements e deixar alguns métodos da interface para as filhas. É o jeito padrão de combinar uma interface (o tipo) com uma classe base (o código compartilhado):

O código usa o type hint da interface Cache, então uma classe que não pode estender BaseCache (porque já estende outra coisa) ainda pode implementar Cache diretamente.

Quando usar uma classe abstrata, e quando não usar

Use uma classe abstrata quando as classes de uma família compartilham código de verdade: propriedades, um construtor, métodos iguais para todas. Se a base não tiver nada além de métodos abstratos, ela é uma interface disfarçada, e uma interface é a melhor escolha, porque uma classe pode implementar várias interfaces mas só estender uma classe. Se você só quer compartilhar alguns métodos auxiliares entre classes sem relação entre si, use uma trait em vez de forçá-las sob uma única classe pai.

Um teste rápido antes de escrever abstract class: cada filha seria mesmo um tipo da base (Circle é um Shape)? Se a resposta honesta for "ela consegue fazer isto" em vez de "ela é um destes", escreva uma interface.

Perguntas frequentes

O que é uma classe abstrata no PHP?

Uma classe declarada com abstract class Name que não pode ser criada com new. Ela é uma base para outras classes: pode conter propriedades, um construtor e métodos normais, e pode declarar métodos abstract que cada classe filha precisa implementar.

O que é um método abstrato no PHP?

Um método declarado com abstract e sem corpo: abstract protected function render(array $rows): string;. Uma classe que contém um precisa ela mesma ser declarada abstract, e toda classe filha não abstrata precisa definir um método com uma assinatura compatível.

Uma classe abstrata pode ter construtor no PHP?

Sim. Você não pode chamar new na classe abstrata, mas o construtor dela roda quando uma classe filha é criada, automaticamente (se a filha não tem construtor) ou por parent::__construct(...).

Dá para instanciar uma classe abstrata no PHP?

Não. new Shape() numa classe abstrata lança um Error: Cannot instantiate abstract class Shape. Crie um objeto de uma classe filha concreta, por exemplo new Circle(2).

Quando devo usar uma classe abstrata no PHP?

Quando várias classes relacionadas compartilham código de verdade (propriedades, um construtor, métodos comuns) e diferem em poucos passos. Coloque o código compartilhado na classe abstrata e declare como abstratos os passos que mudam. Se não houver código compartilhado e você só precisa de um contrato, use uma interface.

Ilustração das linguagens de programação do Coddy

Aprenda a programar com o Coddy

COMEÇAR