PHP 5 introduz métodos e classes abstratos. Não é permitido criar uma instância de uma classe que foi definida como abstrata e qualquer classe que contenha pelo menos um método abstrato deve também ser abstrata. Métodos definidos como abstratos simplesmente declaram a assinatura do método, eles não podem definir a implementação.
Quando uma classe herda uma classe abstrata, todos os métodos marcados como abstratos na declaração da classe pai devem ser definidos na classe filha; além disso, esses métodos devem ser definidos com a mesma (ou menos restrita) visibilidade. Por exemplo, se um método abstrato é definido como protected, a implementação da função deve ser definida ou como protected ou public, mas não private. Além disso, as assinaturas dos métodos devem coincidir, ou seja, as induções de tipos e o número de argumentos requeridos devem ser os mesmos. Isto também se aplica aos construtores a partir do PHP 5.4. Antes do 5.4 as assinaturas dos construtores poderiam ser diferentes.
Exemplo #1 Exemplo de classe abstrata
<?php
abstract class ClasseAbstrata
{
// Força a classe que estende ClasseAbstrata a definir esse método
abstract protected function pegarValor();
abstract protected function valorComPrefixo( $prefixo );
// Método comum
public function imprimir() {
print $this->pegarValor();
}
}
class ClasseConcreta1 extends ClasseAbstrata
{
protected function pegarValor() {
return "ClasseConcreta1";
}
public function valorComPrefixo( $prefixo ) {
return "{$prefixo}ClasseConcreta1";
}
}
class ClasseConcreta2 extends ClasseAbstrata
{
protected function pegarValor() {
return "ClasseConcreta2";
}
public function valorComPrefixo( $prefixo ) {
return "{$prefixo}ClasseConcreta2";
}
}
$classe1 = new ClasseConcreta1;
$classe1->imprimir();
echo $classe1->valorComPrefixo('FOO_') ."\n";
$classe2 = new ClasseConcreta2;
$classe2->imprimir();
echo $classe2->valorComPrefixo('FOO_') ."\n";
?>
O exemplo acima irá imprimir:
ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2
Código antigo que não tem classes ou funções definidas pelo usuário como 'abstract' deve ser executado sem modificações.