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!