PHP
Abstração de classes em PHP
No artigo de hoje explicarei Abstração de Classes em PHP, que consiste em criar classes modelo para outras classes. Uma classe abstrata é que tem métodos abstratos. Os métodos abstratos são os que estão declarados em uma classe, porém não foi definido na classe o código desses métodos. Veremos na prática como se aplicam as classes abstratas, classes finais, métodos abstratos e métodos finais.
Para que você entenda facilmente, nada mais é que criar classes que apenas servirão de modelos para outras classes, sem a possibilidade de serem instanciadas diretamente.
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.
Abstração
Podemos considerar abstração uma forma de separar mentalmente, simplificar ou mesmo considerar isoladamente. Um sistema orientado a objetos, não deve ser visto como uma única peça, nós devemos separá-lo em partes, concentrando nas peças mais importantes e ignorando os detalhes (em primeiro momento), para que possamos construir peças bem-definidas que possam ser reaproveitadas mais tarde, formando uma estrutura hierárquica.
Sempre que estiver desenvolvendo um sistema OO (Orientação Objeto), você deve aplicar este conceito, abstraia ao máximo, concentre-se em separar o sistema em módulos.
Classes Abstratas e Métodos Abstratos
Seguindo o conceito de abstração que acabamos de mencionar, encontraremos classes que irão servir como classes estruturais, ou seja, que estão na nossa hierarquia de classes para servirem de base para outras classes, mas que nunca serão instanciadas em objetos, somente suas filhas.
Neste contexto, é interessante definir está classe como abstrata, de modo que ninguém consiga instancia-la.
Classe abstrata nada mais é do que um modelo comum, que deve ser seguido pelas classes filhas, nunca é instanciado em objeto, ou seja, não existe isoladamente.
Métodos abstratos possuem uma definição semelhante, não podem ser implementados nas classes abstratas, deve ser definida somente a assinatura do método e deve obrigatoriamente, ser implementado na integra pela classe filha que o estender.
Em suma, um método abstrato é definido em uma classe abstrata, mas deve conter somente sua assinatura, o “corpo” do método, fica por conta das classes filhas.
Criando classes abstratas em PHP
Para criar uma classe abstrata em PHP, simplesmente utilize a palavra abstract antes da criação da mesma.
<?php // Superclasse abstrata abstract class Escrever { } // Subclasse abstrata abstract class Ler extends Escrever { } ?>
Com isso, se eu tentar instanciar qualquer uma das classes acima, terá um erro.
<?php // Inclui a classe include('classes/abstrato.php'); // Cria o objeto $classe = new Ler(); ?>
Retornará:
Fatal error: Cannot instantiate abstract class
Seria interessante criar classes abstratas apenas para termos com 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.
<?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 = 'Claudia '; $mulheres->sobrenome = 'Regina '; $mulheres->exibe_nome(); // Claudia Regina ?>
Veja acima que agora não há nenhum erro, o código é executado conforme esperado. Isso acontece porque estou criando um objeto à classe filha da classe "Pessoa". A superclasse "Pessoa" é abstrata e não pode ser instanciada, porém, sua filha "Mulheres" pode.
Métodos abstratos
Métodos abstratos são métodos que são configurados nas classes mãe sem ações, apenas sua assinatura. É obrigatório que você defina suas ações nas classes filhas.
<?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 configurados nas mesmas obrigatoriamente, senão haverá erros de programação.
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.
<?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
Classes finais podem ser definidas como classes que não podem ser estendidas, ou seja, não pode ser uma superclasse.
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 final.
Uma classe é definida como final quando colocamos a palavra reservada final antes da palavra class.
<?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 final, ou seja, ela não pode ser estendida. Como tentei estender seus métodos e propriedades com a palavra extends para a classe "Homens", terei um erro fatal:
No exemplo acima, defini a classe "Mulheres" como final, ou seja, ela não pode ser estendida. Como tentei estender seus métodos e propriedades com a palavra extends para a classe "Homens", terei um erro fatal:
Fatal error: Class Homens may not inherit from final class (Mulheres)
Isso garante maior proteção para sua classe que não pode ter filhas.
Métodos finais
Assim como classes finais, um método final não pode ser estendido e obviamente não pode ser abstrato, pois métodos abstratos foram feitos para serem estendidos e declarados na classe filha.
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.
Para declarar um método como final basta usar a palavra reservada final antes da palavra function.
<?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.
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.
Créditos no exemplo das classes por Luiz Otávio Miranda
Dúvidas, críticas ou sugestões comentem abaixo. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: PHP
Cotações para compra e venda de Moedas estrangeiras com PHP
27 July de 2016
Gerenciador de dependências Composer
14 January de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 November de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 August de 2015
Olá, deixe seu comentário para Abstração de classes em PHP