Abstração de Classes

O PHP possui métodos e classes abstratas. Classes definidas como abstratas não podem ser instanciadas, e qualquer classe que contenha ao menos um método abstrato também deve ser abstrata. Métodos são definidos como abstratos declarando a intenção em sua assinatura, e não podem definir a implementação.

Quando herdando de uma classe abstrata, todos os métodos marcados como abstratos da classe herdada precisam ser definidos na classe implementante. além de seguir as regras usuais de herança e compatibilidade de assinatura.

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 produzirá:

 ConcreteClass1 FOO_ConcreteClass1 ConcreteClass2 FOO_ConcreteClass2 

Exemplo #2 Exemplo de classe abstrata

<?php
abstract class ClasseAbstrata
{
// Esse método abstrato apenas define os argumentos requeridos
abstract protected function prefixName($name);

}

class
ClasseConcreta extends ClasseAbstrata
{

// O método filho pode definir argumentos opcionais não presentes na assitura abstrata
public function prefixName($name, $separator = ".") {
if (
$name == "Pacman") {
$prefix = "Mr";
} elseif (
$name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return
"{$prefix}{$separator}{$name}";
}
}

$class = new ClasseConcreta;
echo
$class->prefixName("Pacman"), "\n";
echo
$class->prefixName("Pacwoman"), "\n";
?>

O exemplo acima produzirá:

 Mr. Pacman Mrs. Pacwoman 
To Top