Uma classe abstrata fornece uma implementação parcial que outras classes podem construir em cima. Quando uma classe é declarada como abstract significa que a classe pode conter métodos incompletas que devem ser implementadas em classes filhas, além de membros normais de classe.
Métodos abstratos
Em uma classe abstrata qualquer método pode ser declarado abstrato. Estes métodos simplesmente não foram implementados e somente suas assinaturas são especificadas, enquanto os blocos de código são substituídos por ponto e vírgula.
<?php abstract class Shape { abstract public function myAbstract(); } ?>
Resumo exemplo
Para dar um exemplo, a classe abaixo tem duas propriedades e um método abstrato.
<?php abstract class Shape { private $x = 100, $y = 100; abstract public function getArea(); } ?>
Se uma classe herda dessa classe abstrata é então forçado a substituir o método abstrato. A assinatura do método deve corresponder, com exceção do nível de acesso que pode ser feito menos restrito.
<?php class Rectangle extends Shape { public function getArea() { return $this->x * $this->y; } } ?>
Não é possível instanciar uma classe abstrata. Eles servem apenas como pais para outras classes, em parte a ditar a sua implementação.
<?php $s = new Shape(); // compile-time error ?>
No entanto, uma classe abstrata pode herdar de uma classe não-abstrata (concreto).
<?php class NonAbstract {} abstract class MyAbstract extends NonAbstract {}
Classes abstratas e interfaces
Classes abstratas são, em muitos aspectos semelhantes a interfaces. Eles podem tanto definir assinaturas de membros que as classes derivadas devem implementar, e nenhum deles pode ser instanciado. As principais diferenças são os primeiros que a classe abstrata pode conter membros não-abstratos, enquanto a interface não pode. Em segundo lugar, uma classe pode implementar qualquer número de interfaces, mas apenas herdar de uma classe, abstrato ou não.
<?php // Define funcionalidade e definições padrão abstract class Shape { public $x = 100, $y = 100; abstract public function getArea(); } // Classe é uma forma class Rectangle extends Shape { /*...*/ } // Define uma funcionalidade específica interface iComparable { function compare(); } // Classe pode ser comparado class MyClass implements iComparable { /*...*/ }
Diretriz das classes abstratas
Uma classe abstrata fornece uma classe base parcialmente implementado que dita como classes filhas devem se comportar. Eles são mais úteis quando classes filhas compartilham algumas semelhanças, mas diferem em outras implementações que classes filhas são necessários para definir. Assim como as interfaces, classes abstratas são construções úteis em programação orientada a objetos que ajudam os desenvolvedores a seguir as boas normas de codificação.