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:

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!



Compartilhe:

Sobre: Abraão Levi

Desenvolvedor web do Kekanto um guia colaborativo de Restaurantes, Bares, Baladas. Acredita em idéias simples e usabilidade. Sigam @AbraaoLevi

Comentários

Sem Comentários

Deixe um Comentário!

Nome: ( necessário )

E-Mail: ( necessário )

Website:

Comentário: