Classes e Objetos
PHP Manual

Abstração de Classes

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.


Classes e Objetos
PHP Manual