Curso de PHP Orientado a Objetos – Parte 5
Quinto artigo do curso de PHP Orientado a Objetos. Neste artigo entenderemos o conceito de abstração. Veremos na prática como se aplicam as classes abstratas, finais, métodos abstratos e métodos finais.
Este é quinto artigo do Curso de PHP Orientado a Objetos.
- Entender o conceito de Abstração
- Criar Classes Abstratas
- Criar Classes Finais
- Criar Métodos Abstratos
- Criar Métodos Finais
Métodos abstratos possuem uma definição semelhante, não podem ser implementados nas classes abstratas, deve ser definido 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
/*Definimos uma classe como abstrata * utilizando a palavra reservada abstract * antes da palavra class */ abstract class Animal { public $nome; public $idade; //O método construtor seta os dois atributos function __construct($nome, $idade) { $this->nome = $nome; $this->idade = $idade; } //O método descrição retorna o nome e a idade public function Descricao() { return $this->nome . ", " . $this->idade . " anos de idade"; } /*O método Falar deve *ser implementado na classe filha *perceba que ele não tem implementação */ abstract public function Falar(); } |
Temos nessa classe todas as características comuns de um animal. Todo animal possui um nome e todo animal possui uma idade, todo animal fala (o cachorro faz Au Au, o gato faz Miau). Perceba que o método Falar não possui nada implementado, além disso, a definição do método é precedida pela palavra abstract, o que significa que o método deve ser implementado em TODAS as classes que estenderem a classe Animal.
Estamos levando para o mundo OO uma definição que temos no mundo real, veja: Um cachorro, um gato, um cavalo são animais, cada um com suas características especificas, mas todos são animais, todos possuem nome, idade e falam. Não faria sentido criar o objeto Animal.
Se tentarmos instanciar a classe animal teríamos o seguinte erro:
Fatal error: cannot instantiate abstract class Animal in animal.class.php on line 5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
// Herdamos a classe Animal class Cachorro extends Animal { /* Somos obrigados a implementar * o método falar */ public function Falar() { return "Au Au!"; } /* Vamos também complementar * o método Descricao */ public function Descricao() { return parent::Descricao() . ", eu sou um cachorro!"; } } |
Agora podemos instanciar a classe Cachorro sem problemas:
1 2 3 |
$animal = new Cachorro("Rex", 5); echo $animal->Descricao(); echo $animal->Falar(); |
Da mesma forma que criamos a classe Cachorro, poderíamos criar a classe Gato, Cavalo, Pato, todas herdando da classe Animal.
Classes Finais
Classes finais podem ser definidas como classes que não podem ser estendidas ou seja, não pode ser uma superclasse.
Uma classe é definida como final quando colocamos a palavra reservada final antes da palavra class.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
final class Cachorro { public $nome; public $idade; function __construct($nome, $idade) { $this->nome = $nome; $this->idade = $idade; } public function Descricao() { return $this->nome . ", " . $this->idade . " anos de idade"; } } |
A classe cachorro definida aqui, não pode ser herdada por nenhuma outra classe.
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.
Para declarar um método como final basta usar a palavra reservada final antes da palavra function.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Class Cachorro { public $nome; public $idade; /* Este método não pode * se estendido (sobrescrito) */ final function Descricao() { return $this->nome . ", " . $this->idade . " anos de idade"; } } |
Terminamos assim mais um módulo do curso.
No próximo artigo falaremos sobre o encapsulamento.
Utilize o espaço de comentários para tirar suas dúvidas.
Parabéns pelo curso estou nesse post e aprendendo bastante sobre OO. Obrigado por compartilhar seus conhecimentos!!!
Obrigado pelo comentário
Só me tire uma dúvida, a subclasse de Animal, Cachorro deve ser criada no mesmo arquivo da Class Animal? Ou eu posso criar um novo arquivo e criar esse subclasse?
Isso você escolhe. É uma questão de organização. Eu costumo separar.
Obrigado pelo comentário.
O correto é vc criar outro arquivo para representar as subclasses, não sei se estou falando besteira mas não sei se pode criar até 2 classes em um arquivo, como estou aprendendo tbm vou tirar essa dúvida, se tem alguém mais experiente ai que possa dar esse up ai, mas a principio amigo, subclasses crie sempre em arquivos separados, assim cm o leandro, tbm crio os meus separados tbm
O que faço com classes e métodos abstratos não posso fazer simplesmente com a aplicação pura e simples de herança? Sem o uso de “abstract”, criação de classe-pai, classe-filha, etc? Se sim, por que devo usar “classes e métodos abstratos”? É opcional? Quando é recomendado expressamente seu uso?
Nota: estou começando meus estudos de PHP Orientado a Objetos e encontrei o seu site. Parabéns pela iniciativa e pela qualidade do material. Deveria continuar com as “aulas” no site, vejo que já faz um tempo que não posta material novo – continue que você está no caminho certo.
Estou começando a estudar OO, e já estou me sentindo quase no nivel 5, hehe
vlw cara, Deus te abenço mais e mais!
Excelente Conteúdo muitíssimo obrigada Leandro! acho q se eu não tivesse encontrado esse conteúdo
nunca iria aprender tão bem POO!
Obrigado por compartilhar seu conhecimento assim vc ajuda as pessoas que estao começando e adiqui mais e mais conhecimeto com essa sua atitudo adimirado pelo seu talento e paciencia obrigado de novo ate agora nao tive nenhuma duvida, muito bem esplicado valeu
Primeiramente, parabéns pelo ótimo conteúdo e pela iniciativa.
Tenho uma dúvida quanto aos métodos finais: Se eu tenho uma classe comum X, não final, mas tenho um método final x nela e crio uma classe filha Y para essa classe X, o método x não poderá ser herdado por Y ou apenas não poderá ser sobrescrito em Y?
Mais uma coisa, você poderia citar um exemplo onde seria necessário um método final numa classe comum? Pois eu não consegui imaginar uma classe filha que não pudesse realizar uma ação da classe pai numa situação do mundo real, como nos animais, por exemplo.
Desde já agradeço.
Cara muito bom seus tutoriais, está me ajudando bastante, continue assim !
Estou aprendendo muito com seus totoriais agradeceria se continuaces com os tutoriais.
Muita força e muito obrigado cara!
Olá estou aprendendo bastante com as suas aulas, mas me surgiu uma dúvida: Na pratica qual a necessidade de usar uma classe abstrata? Não é mais fácil fazer uma simples herança?