PHP orientado à objetos – parte 4
Postado por Abraão Levi em 15 de janeiro de 2011
Depois de um começo de ano bastante corrido, vamos continuar com a série de artigos sobre orientação à objetos com PHP, hoje vamos falar sobre herança e polimorfismo. Se você não está acompanhando , veja os artigos anteriores:
- PHP orientado à objetos – parte 1
- PHP orientado à objetos – parte 2
- PHP orientado à objetos – parte 3
O que é herança?
Herança é um mecanismo que permite que características comuns a diversas classes sejam agrupadas em uma classe base, ou superclasse. A partir de uma classe base, outras classes podem ser especificadas. Cada classe derivada ou subclasse apresenta as características (estrutura e métodos) da classe base e acrescenta a elas o que for definido de particularidade para ela
Difícil? Deixa-me simplificar um pouco: imagine a classe “Animal”, todos animais tem as propriedades peso, cor dos olhos e idade. Todos animais também tem o método respirar. Agora imagine as classes “Cachorro” e “Gato”, os dois são animais, porém tem comportamentos diferentes (um “late” e outro “mia”). Então essas classes herdam da classe “Animal” os métodos e propriedades comuns, e então são implementados nessas classes os métodos e atributos específicos.
Utilizando Herança de Classe no PHP
As classes podem herdar os métodos e propriedades de outra classe usando a palavra chave extends. Por exemplo, para criar uma segunda classe que herda métodos da classe principal basta adicionar extends MyClass, vejamos o exemplo no nosso arquivo de testes:
<?php class MyClass { public $prop1 = "Eu sou uma propriedade da classe!"; public function __construct() { echo 'A classe "', __CLASS__, '" foi inicializada!<br />'; } public function __destruct() { echo 'A classe "', __CLASS__, '" foi destruida.<br />'; } public function setProperty($novoValor) { $this->prop1 = $novoValor; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function newMethod() { echo "Novo método a partir da classe " . __CLASS__ . ".<br />"; } } // Cria um novo Objeto $newobj = new MyOtherClass; // Retorna o conteúdo do novo método echo $newobj->newMethod(); // Usa um método que foi herdado da "classe pai" echo $newobj->getProperty(); ?>
Ao recarregar o arquivo de teste no seu navegador:
A classe MyClass foi inicializada! Novo método a partir da classe MyOtherClass. Eu sou uma propriedade da classe! A classe MyClass foi destruida!
Substituições métodos e propriedades herdadas
Para alterar o comportamento de um método ou propriedade existente na nova classe, você pode simplesmente substituí-lo, declarando-o novamente na nova classe, isso é conhecido como Polimorfismo:
<?php class MyClass { public $prop1 = "Eu sou uma propriedade da classe!"; public function __construct() { echo 'A classe "', __CLASS__, '" foi inicializada!<br />'; } public function __destruct() { echo 'A classe "', __CLASS__, '" foi destruida.<br />'; } public function setProperty($novoValor) { $this->prop1 = $novoValor; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { echo 'Sou um novo construtor a partir da classe "', __CLASS__, '"!<br />'; } public function newMethod() { echo "Novo método a partir da classe " . __CLASS__ . ".<br />"; } } // Cria um novo Objeto $newobj = new MyOtherClass; // Retorna o conteúdo do novo método echo $newobj->newMethod(); // Usa um método que foi herdado da "classe pai" echo $newobj->getProperty(); ?>
Isso muda a saída no navegador para:
Sou um novo construtor a partir da classe MyOtherClass! Novo método a partir da classe MyOtherClass. Eu sou uma propriedade da classe! A classe MyClass foi destruida!
Preservando a funcionalidade método original
Para adicionar uma nova funcionalidade para um método herdado, mantendo o método original intacta, usa-se a palavra reservada parent junto com o operador “dois-pontos, dois-pontos” (::), veja o exemplo:
<?php class MyClass { public $prop1 = "Eu sou uma propriedade da classe!"; public function __construct() { echo 'A classe "', __CLASS__, '" foi inicializada!<br />'; } public function __destruct() { echo 'A classe "', __CLASS__, '" foi destruida.<br />'; } public function setProperty($novoValor) { $this->prop1 = $novoValor; } public function getProperty() { return $this->prop1 . "<br />"; } } class MyOtherClass extends MyClass { public function __construct() { parent::__construct(); // Chama o método construtor da classe pai echo 'Sou um novo construtor a partir da classe "', __CLASS__, '"!<br />'; } public function newMethod() { echo "Novo método a partir da classe " . __CLASS__ . ".<br />"; } } // Cria um novo Objeto $newobj = new MyOtherClass; // Retorna o conteúdo do novo método echo $newobj->newMethod(); // Usa um método que foi herdado da "classe pai" echo $newobj->getProperty(); ?>
Isso mostra o resultado de ambos, o construtor pai e o construtor da classe nova:
A classe MyClass foi inicializada! Sou um novo construtor a partir da classe MyOtherClass! Novo método a partir da classe MyOtherClass. Eu sou uma propriedade da classe! A classe MyClass foi destruida!
Então é isso! No próximo artigo vamos falar um pouco sobre visibilidade de atributos e métodos.
Até a próxima!
Artigo postado em: Artigos e tutoriais, PHP
Tags: heranca, OO, orientação à objetos, PHP, polimorfismo

Comentários
Sem Comentários
Deixe um Comentário!