Abstração de Classes em PHP

Nenhum produto encontrado nessa seleção.

Abstração de Classes em PHP tem tudo a ver com a nossa última aula sobre PHP com Programação Orientada a Objetos – a herança.

Trata-se de criar classes que apenas servirão de modelos para outras classes, sem a possibilidade de serem instanciadas diretamente.

Também existem os métodos abstratos, que servem para definir que um método específico deverá, obrigatoriamente, existir em uma subclasse (classe filha), com ações específicas da necessidade daquela subclasse.

Vamos ver como criar classes e métodos abstratos em PHP na prática. Além disso, também veremos classes e métodos finais.

Criando classes abstratas em PHP

Para criar uma classe abstrata em PHP, simplesmente utilize a palavra {php}abstract{/php} antes da criação da mesma. Veja:

<?php
// Superclasse abstrata
abstract class Escrever
{

}

// Subclasse abstrata
abstract class Ler extends Escrever
{

}
?>

Com isso, se eu tentar instanciar qualquer uma das classes acima, terei um erro.

<?php
// Inclui a classe
include('classes/abstrato.php');

// Cria o objeto
$classe = new Ler;
?>

Retornará:

Fatal error: Cannot instantiate abstract class Ler in E:ProgramasEasyPHPdatalocalwebcursosphpaula_34index.php on line 6

É interessante criar classes abstratas apenas para modelos de outras classes, ou seja, classes filhas terão os mesmos métodos e propriedades das classes mães, portanto, é mais sensato instanciar (criar um objeto) das filhas, e não das mães.

Por exemplo:

<?php
// Uma pessoa
abstract class Pessoa
{
	// Propriedades de identificação da pessoa
	public $nome;
	public $sobrenome;
	
	// Exibe a identificação
	public function exibe_nome () {
		echo $this->nome . ' ' . $this->sobrenome . '<br>';
	}
}

// Classe filha (subclasse) da classe Pessoa
class Mulheres extends Pessoa
{
	// Os métodos já definidos em Pessoa
}
?>

Utilizando:

<?php
// Inclui a classe
include('classes/abstrato.php');

// Cria o objeto
$mulheres = new Mulheres;

// Configura as propriedades
$mulheres->nome      = 'Rose ';
$mulheres->sobrenome = 'Miranda ';

$mulheres->exibe_nome(); // Rose Miranda
?>

Veja acima que agora não tenho nenhum erro, o código é executado conforme esperado. Isso acontece porque estou criando um objeto (instanciando) a classe filha (a subclasse) da classe "Pessoa". A superclasse "Pessoa" é abstrata e não pode ser instanciada, porém, sua filha "Mulheres" pode.

Dica: Tenha em mente que eu posso configurar superclasses (classes mãe) e subclasses (classes filhas) como abstratas.

Métodos abstratos

Métodos abstratos são métodos que são configurados nas classes mãe sem ações. É obrigatório que você defina suas ações nas classes filhas.

Veja:

<?php
// Uma pessoa
abstract class Pessoa
{
	// Método abastrato
	abstract protected function exibir();
}

// Classe filha (subclasse) da classe Pessoa
class Mulheres extends Pessoa
{
	// Construtor
	function __construct () {
		$this->exibir();
	}
	
	// Defino as ações do método abastrato
	protected function exibir () {
		echo 'Qualquer coisa';
	}
}
?>

Na superclasse "Pessoa", defini um método chamado "exibir". Tal método não tem ações, porém, por se tratar de um método abstrato, todas as classes filhas (subclasses) deverão ter o método exibir, e as ações desse método deverão ser configuradas nas mesmas.

Conforme requisito, fiz a configuração do método "exibir" na subclasse "Mulheres". Além disso, o método abstrato deve ter visibilidade igual ou inferior ao método da classe mãe.

O nosso método exibir tem visibilidade "protected" na superclasse "Pessoa", portanto, ele só poderá ter visibilidade "public" ou "protected" nas classes filhas. Por este motivo, eu não poderia chamar o método diretamente em meu código, então criei um método construtor que "chama" o método "exibir". Como consequência, assim que eu instanciar a classe "Mulheres", o método "exibir" será executado.

Veja:

<?php
// Inclui a classe
include('classes/abstrato.php');

// Cria o objeto
$mulheres = new Mulheres; // Exibe: Qualquer coisa
?>

Os métodos abstratos garantem que todas as classes filhas tenham o mesmo método com ações diferentes para cada uma.

Classes finais

Você também pode proteger uma classe para que ela não seja mais estendida para classes filhas, isso pode ser feito com a palavra {php}final{/php}, veja:

<?php
// Uma pessoa
abstract class Pessoa
{
	// Método abastrato
	abstract protected function exibir();
}

// Classe filha (subclasse) da classe Pessoa
final class Mulheres extends Pessoa
{
	// Construtor
	function __construct () {
		$this->exibir();
	}
	
	// Defino as ações do método abastrato
	protected function exibir () {
		echo 'Qualquer coisa';
	}
}

// Erro: A classe Mulheres não pode ser estendida
class Homens extends Mulheres 
{

}
?>

No exemplo acima, defini a classe "Mulheres" como {php}final{/php}, ou seja, ela não pode ser estendida. Como tentei estender seus métodos e propriedades com a palavra {php}extends{/php} para a classe "Homens", terei um erro fatal:

Fatal error: Class Homens may not inherit from final class (Mulheres) in Cursosphpaula_34classesabstrato.php on line 27

Isso garante maior proteção para sua classe que não pode ter filhas.

Métodos finais

Métodos (funções da classe) finais, não podem ser sobrescritos, ou seja, as classes filhas terão acesso a eles, porém, não poderão reescrever suas ações.

Você define um método final com a palavra {php}final{/php}, veja:

<?php
// Uma pessoa
abstract class Pessoa
{
	// Método final
	final protected function exibir() {
		echo 'Sempre serei o mesmo, em todas as subclasses.';
	}
}

// Classe filha (subclasse) da classe Pessoa
final class Mulheres extends Pessoa
{
	// Construtor
	function __construct() {
		// Chama o método final
		$this->exibir();
	}
}
?>

Se eu tentar sobrescrever o método "exibir" na classe "Mulheres", terei um erro. Veja:

<?php
// Uma pessoa
abstract class Pessoa
{
	// Método final
	final protected function exibir() {
		echo 'Sempre serei o mesmo, em todas as subclasses.';
	}
}

// Classe filha (subclasse) da classe Pessoa
final class Mulheres extends Pessoa
{
	// Tento reescrever um método final
	protected function exibir() {
		// Mesmo sem ações, terei um erro
	}
}
?>

No trecho acima, terei o erro:

Fatal error: Cannot override final method Pessoa::exibir() in Cursosphpaula_34classesabstrato.php on line 18

Por tentar sobrescrever o método "exibir" na classe filha "Mulheres".

Concluindo

Abstração é parte essencial da programação orientada a objetos, portanto, é importante que você entenda todos os aspectos. Ela estará presente em praticamente todas as linguagens de programação, não só em PHP.

Se você tiver alguma dúvida, basta questionar aí nos comentários, e não deixe de ver as outras aulas do Curso de PHP gratuito e PHP Orientado a objetos.

Até a próxima!