A herança em PHP 5 – Segunda Parte

Como estamos vendo, os mecanismos de herança em PHP 5 são similares aos existentes em outras linguagens de programação. Agora vamos relatar como construir uma classe que herda de outra.

Continuando com nosso exemplo da locadora de vídeo, vamos construir uma classe para os suportes de tipo fita de vídeo. As fitas de vídeo têm um atributo novo que é a duração da fita. Não têm nenhuma classe nova, embora devemos aprender a sobrescrever métodos criados para o suporte, visto que agora têm que fazer tarefas mais específicas.

Sobrescrever métodos

Antes de mostrar o código da classe fita_video, vamos falar sobre a sobrescritura ou substituição de métodos, que é um mecanismo pelo qual uma classe que herda pode redefinir os métodos que está herdando.

Pensemos em uma cafeteira. Sabemos que existem muitos tipos de cafeteiras e todas fazem café, mas o mecanismo para fazer o café é distinto dependendo do tipo de cafeteira. Existem cafeteiras express, cafeteiras por gotas e até se pode fazer café com uma meia! Nossa cafeteira “pai” (da que vai herdar todas as cafeteiras) pode ter definido um método fazer_cafe(), mas não necessariamente todas as cafeteiras que possam herdar desta fazem o café seguindo o mesmo processo.

Então podemos definir um método para fazer café padrão, que teria a classe cafeteira. Mas ao definir as classes cafeteira_express e cafeteira_gotas, deveríamos sobrescrever o método fazer_cafe() para que se ajuste ao procedimento próprio destas.

A sobrescritura de métodos é algo bastante comum em mecanismos de herança, visto que os métodos que foram criados para uma classe “pai” não têm porquê ser os mesmos que os definidos nas classes que herdam.

Veremos como sobrescrever ou substituir métodos em um exemplo de herança, seguindo nosso exemplo da locadora de vídeo.

Sintaxe para herdar em PHP 5

Havíamos comentado que a locadora de vídeo dispõe de diferentes elementos para alugar, como fitas de vídeo, DVD ou jogos. Havíamos criado uma classe suporte, que vamos herdar em cada um dos elementos disponíveis para alugar. Vamos começar pela classe fita_video, cujo código será o seguinte:

class fita_video extends suporte{
private $duracao;

function __construct($tit,$num,$preco,$duracao){
parent::__construct($tit,$num,$preco);
$this->duracao = $duracao;
}

public function imprime_caracteristicas(){
echo “Filme em VHS:<br>”;
parent::imprime_caracteristicas();
echo “<br>Duracao: ” . $this->duracao;
}
}

Com a primeira linha class fita_video extends suporte estamos indicando que está sendo definida a classe fita_video e que vai herdar da classe suporte.

Nota: Como está sendo herdado de uma classe, PHP tem que conhecer o código da classe “pai”, neste caso, a classe suporte. De modo que o código da classe suporte deve estar incluído dentro do arquivo da classe fita_video. Podemos colocar os dois códigos no mesmo diretório, ou se estão em diretórios independentes, devemos incluir o código da classe suporte com a instrução include ou require de PHP.

Na classe fita_video definimos um novo atributo chamado $duracao, que armazena o tempo que dura o filme.

Embora a classe sobre a qual herdamos (a classe suporte) tinha definido um construtor, a fita de vídeo deve iniciar a nova propriedade $duracao, que é específica das fitas de vídeo. Por isso, vamos sobrescrever ou substituir o método construtor, o que se faz simplesmente voltando a escrever o método. A graça aqui consiste em que o sistema pode basear a nova declaração do construtor na declaração que existia para a classe da que herda.

Ou seja, já havia sido definido um construtor para a classe suporte, que iniciava os atributos desta classe. Agora, para a classe fita_video, há que iniciar os atributos definidos na classe suporte, mais o atributo $duracao, que é o próprio de fita_video.

O código do construtor é o seguinte:

function __construct($tit,$num,$preco,$duracao){
parent::__construct($tit,$num,$preco);
$this->duracao = $duracao;
}

Na primeira linha do construtor é chamado ao construtor criado para a classe “suporte”. Para isso, utilizamos parent:: e logo o nome do método da classe pai ao que se quer chamar, neste caso __construtor(). Ao construtor da classe pai lhe enviamos as variáveis que serão iniciadas com a classe pai.

Na segunda linha do construtor inicia-se o atributo duração, com o que tivermos recebido por parâmetro.

Acontece o mesmo com o método imprime_caracteristicas(), que agora deve mostrar também o novo atributo, próprio da classe fita_video. Como se pode observar no código da função, faz-se uso também de parent::imprime_caracteristicas() para utilizar o método definido na classe pai.

Se quisermos provar a classe fita_video, poderíamos utilizar um código como este:

$minhafita = new fita_video(“Os Outros”, 22, 4.5, “115 minutos”);
echo “<b>” . $minhafita->titulo . “</b>”;
echo “<br>Preco: ” . $minhafita->dar_preco_sem_imposto() . ” euros”;
echo “<br>Preco IVA incluido: ” . $minhafita->dar_preco_com_iva() . ” euros”;

O que nos devolveria o seguinte:

Os Outros
Preço: 4.5 euros
Preço IVA incluído: 5.22 euros
Filme em VHS:
Os Outros
4.5 (IVA não incluído)
Duração: 115 minutos

Fonte: http://www.criarweb.com/artigos/460.php

Deixe um comentário