Você está na página 1de 3

A herana em PHP 5 Segunda Parte

Continuamos com os mecanismos de herana em PHP5. Criamos classes que herdam de


outra classe e aprendemos a sobrescrever mtodos.
Por Miguel Angel Alvarez - Traduo de JML

Publicado em: 02/12/05


Valorize este artigo:
0 votos

Como estamos vendo, os mecanismos de herana em PHP 5 so similares aos


existentes em outras linguagens de programao. Agora vamos relatar como
construir uma classe que herda de outra.
Continuando com nosso exemplo da locadora de vdeo, vamos construir uma classe
para os suportes de tipo fita de vdeo. As fitas de vdeo tm um atributo novo que
a durao da fita. No tm nenhuma classe nova, embora devemos aprender a
sobrescrever mtodos criados para o suporte, visto que agora tm que fazer tarefas
mais especficas.
Sobrescrever mtodos
Antes de mostrar o cdigo da classe fita_video, vamos falar sobre a sobrescritura
ou substituio de mtodos, que um mecanismo pelo qual uma classe que herda
pode redefinir os mtodos 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 mtodo fazer_cafe(), mas no necessariamente
todas as cafeteiras que possam herdar desta fazem o caf seguindo o mesmo
processo.
Ento podemos definir um mtodo para fazer caf padro, que teria a classe
cafeteira. Mas ao definir as classes cafeteira_express e cafeteira_gotas, deveramos
sobrescrever o mtodo fazer_cafe() para que se ajuste ao procedimento prprio
destas.
A sobrescritura de mtodos algo bastante comum em mecanismos de herana,
visto que os mtodos que foram criados para uma classe "pai" no tm porqu ser
os mesmos que os definidos nas classes que herdam.
Veremos como sobrescrever ou substituir mtodos em um exemplo de herana,
seguindo nosso exemplo da locadora de vdeo.
Sintaxe para herdar em PHP 5
Havamos comentado que a locadora de vdeo dispe de diferentes elementos para
alugar, como fitas de vdeo, DVD ou jogos. Havamos criado uma classe suporte,
que vamos herdar em cada um dos elementos disponveis para alugar. Vamos
comear pela classe fita_video, cujo cdigo 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 cdigo da classe
"pai", neste caso, a classe suporte. De modo que o cdigo da classe suporte deve estar
includo dentro do arquivo da classe fita_video. Podemos colocar os dois cdigos no mesmo
diretrio, ou se esto em diretrios independentes, devemos incluir o cdigo da classe suporte
com a instruo 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 vdeo deve iniciar a nova propriedade $duracao, que
especfica das fitas de vdeo. Por isso, vamos sobrescrever ou substituir o mtodo
construtor, o que se faz simplesmente voltando a escrever o mtodo. A graa aqui
consiste em que o sistema pode basear a nova declarao do construtor na
declarao 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 prprio de
fita_video.
O cdigo 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 mtodo da classe pai ao
que se quer chamar, neste caso __construtor(). Ao construtor da classe pai lhe
enviamos as variveis que sero iniciadas com a classe pai.
Na segunda linha do construtor inicia-se o atributo durao, com o que tivermos
recebido por parmetro.
Acontece o mesmo com o mtodo imprime_caracteristicas(), que agora deve
mostrar tambm o novo atributo, prprio da classe fita_video. Como se pode
observar no cdigo da funo, faz-se uso tambm de
parent::imprime_caracteristicas() para utilizar o mtodo definido na classe pai.
Se quisermos provar a classe fita_video, poderamos utilizar um cdigo 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
Preo: 4.5 euros
Preo IVA includo: 5.22 euros
Filme em VHS:
Os Outros
4.5 (IVA no includo)
Durao: 115 minutos