Você está na página 1de 13

PHP 5

Orientado
a Objetos
Introduo ao PHP 5
Com as primeiras 2 verses de PHP, PHP 3 e PHP 4, conseguiram uma plataforma potente e estvel
para a programao de pginas do lado do servidor. Estas verses serviram muito de ajuda para a
comunidade de desenvolvedores, tornando possvel que PHP seja a linguagem mais utilizada na web para a
realizao de pginas avanadas.

Entretanto, ainda existiam pontos negros no desenvolvimento de PHP que trataram de solucionar
com a verso 5, aspectos que fizeram falta na verso 4, quase desde o dia de seu lanamento. Referimo-
nos principalmente programao orientada a objetos (POO) que, apesar de estar suportada a partir de
PHP3, s implementava uma parte muito pequena das caractersticas deste tipo de programao.

Nota: A orientao a objetos uma maneira de programar que trata de modelar os processos de
programao de uma maneira prxima realidade: tratando a cada componente de um programa como um
objeto com suas caractersticas e funcionalidades. Podemos ver uma pequena introduo no artigo O que
a programao orientada a objetos.

O principal objetivo de PHP5 foi melhorar os mecanismos de POO para solucionar as carncias das
verses anteriores. Um passo necessrio para conseguir que PHP seja uma linguagem apta para todo tipo
de aplicaes e meios, inclusive os mais exigentes.

Instalao de PHP5 com WAMP5


Existe um pacote de instalao chamado WAMP5 que pode instalar em conjunto Apache, PHP
5, MySQL e PHPMyAdmin. Neste captulo, ainda nos referimos forma de instalao de WAMP5 e
outras opes para aumentar as possibilidades do pacote.

Existe uma maneira de comear a utilizar PHP5 em Windows sem ter que sofrer as complicaes
tpicas da instalao dos servidores necessrios para programar em PHP. Trata-se de instalar um pacote
chamado WAMP, que permite instalar e configurar em um s processo o servidor Apache, a base de dados
MySQL e o mdulo de programao em PHP verso 5.

WAMP um sistema indicado para os usurios que no tm instalado no sistema nenhum dos
programas necessrios para programar em PHP (Apache, PHP e MySQL), j que realiza uma instalao
completa e desde zero. Mas tambm podem utilizar este programa os usurios que dispem de Apache,
PHP e/ou MySQL em seu sistema. Em cujo caso, simplesmente se realizar outra cpia das aplicaes em
um diretrio distinto, que princpio, no tem porque interferir com as outras instalaes alojadas em nosso
computador.

Programas que contem WAMP5

O software que se instala com WAMP5 contem os seguintes servidores e programas:


Apache 2.2.6. O servidor de pginas web mais difundido do mercado. Embora a ltima verso deste
servidor seja Apache 2, instala-se uma verso anterior que mais estvel. Existe um Add-on que permite
substituir a verso 1.3.31 de Apache pela ltima verso.
PHP 5.2.5. O motor renovado da linguagem.
MySQL 5.0.45. A base de dados mais difundida para utilizar com PHP.
PHPmyadmin. Um software que permite administrar uma base de dados atravs de uma interface
web.
SQLitemanager. Um sistema para administrar uma base de dados a partir de sentenas SQL.
Instalao de WAMP

Nota: A verso dos software acima so referentes at a data de criao desta apostila.

A instalao se realiza atravs de um executvel Windows onde podem se introduzir poucas


configuraes, apenas o diretrio onde desejarmos que se instalem os programas. Depois do processo de
instalao foram criados dois servios com o servidor web e o de base de dados:
Servio wampapache: Relacionado com o servidor Apache.
Servio wampmysql: Relacionado com a base de dados MySQL.
Ademais, dentro do diretrio onde tivermos instalado WAMP5 ter sido criado uma pasta chamada
"www", que corresponde com o diretrio de publicao, ou seja, o lugar onde devem ser colocadas as
pginas web.

Durante a instalao tambm devemos decidir se desejamos que WAMP5 se inicie automaticamente
ao ligar o computador ou se desejamos que seu funcionamento se realize manualmente.

Funcionamento dos servidores

Quando instalamos WAMP5 se cria um grupo de programas chamado WampServer, onde poderemos
encontrar uma opo que pe "Start Wampserver", que ser necessrio executar se no tivermos
selecionado que o servidor se inicie automaticamente.

Uma vez o WampServer em funcionamento obteremos um cone na barra de tarefas com a forma
parecida a de um marcador de velocidade. Se clicarmos sobre esse cone, abrir um menu com opes
variadas para providenciar os servios relacionados com o pacote.

Podemos provar se os servios esto funcionando perfeitamente acessando pgina de incio do


servidor, escrevendo na barra de endereos de nosso navegador algo como http://localhost/.

Ento dever aparecer uma pgina com vrios links s distintas ferramentas instaladas com WAMP5,
alm de algumas pginas de proba de PHP.

Add-ons

Existem vrios acrscimos que podem ser instalados com WAMP, para ampliar as possibilidades do
pacote. Por exemplo, podemos instalar um add-on para permitir que WAMP trabalhe com PHP5 ou com
PHP4, criando una nova opo no menu de WAMP5 que permite mudar de uma verso a outra de PHP.
Existem outros acrscimos disponveis:
Instalar ActiveState Perl em nosso sistema, para permitir a execuo de CGI.
Atualizar a verso de Apache 2.
Instalar Zend Optimizer, para melhorar o comportamento em tempo de execuo de PHP.
Por ltimo, o add-on que instala Webalizer, um sistema para obter estatsticas de uso do servidor
web.
Pode-se obter mais informao deste sistema e opes para download na pgina
http://www.en.wampserver.com/

Modelo de orientao a objetos em PHP 5


Como PHP 5 trabalha com a orientao a objetos. Lista das novidades em relao aos objetos
em verses anteriores.

Um dos problemas mais bsicos das verses anteriores de PHP era a clonagem de objetos, que se
realizava ao atribuir um objeto a outra varivel ou ao passar um objeto por parmetro em uma funo. Para
resolver este problema PHP5 usa os manipuladores de objetos (Object handles), que so uma espcie de
ponteiros que apontam os espaos de memria onde residem os objetos. Quando se atribui um manipulador
de objetos ou se passa como parmetro em uma funo, se duplica o prprio object handle e no o objeto
em si.

Nota: Tambm pode-se realizar uma clonagem de um objeto, para obter uma cpia exata, mas que
no o prprio objeto. Para isso, utilizamos uma nova instruo chamada " clone", que veremos mais
adiante.

Algumas caractersticas do trabalho com POO em PHP 5


Vejamos a seguir uma pequena lista das novas caractersticas da programao orientada a
objetos (POO) em PHP5. No vamos descrever exaustivamente cada caracterstica. Faremos isso
mais adiante neste mesmo manual.

1.- Nomes fixos para os construtores e destrutores


Em PHP 5 temos que utilizar nomes pr-definidos para os mtodos construtores e destrutores (Os
que se encarregam de resumir as tarefas de iniciao e de destruio dos objetos. Agora se chamam
__construct e __destruct.

2.- Acceso public, private e protected a propriedades e mtodos


A partir de agora podemos utilizar os modificadores de acesso habituais da POO. Estes
modificadores servem para definir que mtodos e propriedades das classes so acessveis desde cada
meio.

3.- Possibilidade de uso de interfaces


As interfaces se utilizam na POO para definir um conjunto de mtodos que implementa uma classe.
Uma classe pode implementar vrias interfaces ou conjuntos de mtodos. Na prtica, o uso de interfaces
utilizado muitas vezes para suprir a falta de herana mltipla de linguagens como PHP ou Java.
Explicaremos isto com detalhe mais adiante.

4.- Mtodos e classes final


Em PHP 5 pode-se indicar que um mtodo "final". Com isso, no se permite sobrescrever esse
mtodo, em uma nova classe que o herde. Se a classe "final", o que se indica que esta classe no
permite ser herdada por outra classe.

5.- Operador instanceof


Utiliza-se para saber se um objeto uma instncia de uma classe determinada.

6.- Atributos e mtodos static


Em PHP5 podemos fazer uso de atributos e mtodos "static". So as propriedades e funcionalidades
as quais se pode acessar a partir do nome de classe, sem a necessidade de haver instanciado um objeto de
tal classe.

7.- Classes e mtodos abstratos


Tambm possvel criar classes e mtodos abstratos. As classes abstratas no se podem instanciar,
costumam ser utilizadas para herda-las de outras classes que no tm porque serem abstratas. Os mtodos
abstratos no podem ser chamados, utilizam-se mais para serem herdados por outras classes, onde no
tm porque serem declarados abstratos.

8.- Constantes de classe


Pode-se definir constantes dentro da classe. Logo, pode-se acessar tais constantes atravs da
prpria classe.

9.- Funes que especificam a classe que recebem por parmetro


Agora podem se definir funes e declarar que devem receber um tipo especfico de objeto. No caso
de que o objeto no seja da classe correta, se produz um erro.

10.- Funo __autoload


habitual que os desenvolvedores escrevam um arquivo por cada classe que realizam, como tcnica
para organizar o cdigo das aplicaes. Por essa razo, s vezes fatigante realizar os incluis de cada um
dos cdigos das classes que se utilizam em um script. A funo __autoload serve para tentar incluir o
cdigo de uma classe que se necessite, e que no tenha sido declarada ainda no cdigo que est sendo
executada.

11.- Clonagem de objetos


Se desejarmos, podemos realizar um objeto a partir da cpia exata de outro objeto. Para isso, utiliza-
se a instruo"clone". Tambm pode se definir o mtodo __clone para realizar tarefas associadas coma
clonagem de um objeto.

Classes em PHP 5
Vemos o que uma classe, como podemos defini-la e instanci-la.

Classes em PHP 5

As classes em Programao orientada a objetos (POO) so definies dos elementos que formam
um sistema, neste caso, definies dos objetos que vo intervir em nossos programas.
Um objeto se define indicando que propriedades e funcionalidades tm. Justamente essas
declaraes so o que uma classe. Quando se faz uma classe simplesmente se especifica que
propriedades e funcionalidades tm. Por exemplo, um homem poderia ter como propriedades o nome ou a
idade e como funcionalidades, comer, mover-se ou estudar.

Na classe homem, declararamos dois atributos: a idade ou o nome, que seriam como duas variveis.
Tambm deveramos criar trs mtodos, com os procedimentos a seguir para que o homem possa comer,
mover-se ou estudar. Estes mtodos se definem declarando funes dentro da classe.

O cdigo para definir uma classe pode ser visto a seguir:

class home{
var $nome;
var $idade;

function comer($comida){
//aqui o cdigo do mtodo
}

function moverse($destino){
//aqui o cdigo do mtodo
}

function estudar($diciplina){
//aqui o cdigo do mtodo
}
}

Poder se comprovar que este cdigo no difere em nada das verses anteriores de PHP, que j
suportavam certas caractersticas da POO. Esta situao mudar explorando um pouco mais as
caractersticas mais avanadas de PHP 5, que implicaro melhoras que no estavam presentes nas
verses anteriores

Instanciar objetos a partir de classes

Vimos que uma classe somente uma definio. Se quisermos trabalhar com as classes devemos
instanciar objetos, processo que consiste em gerar um exemplar de uma classe.

Por exemplo, temos a classe homem anterior. Com a classe em si no podemos fazer nada, mas
podemos criar objetos homem a partir dessa classe. Cada objeto homem ter umas caractersticas prprias,
como a idade ou o nome. Ademais poder desempenhar umas funes como comer ou mover-se, agora
tambm, cada um comer ou se mover por sua prpria conta quando lhe for solicitado, sem interferir
princpio, com o que possa estar fazendo outro homem.

Aproveitando, vamos ver como se gerariam dois homens, ou seja, como se instanciariam dois objetos
da classe homem. Para isso, utilizamos o operador new.

$carol = new nome;


$jorge = new nome;

Concluso

importante se dar conta da diferena entre um objeto e uma classe. A classe uma definio de
umas caractersticas e funcionalidades, algo abstrato que se concretiza com a instanciao de um objeto de
tal classe.
Um objeto j tem propriedades, com seus valores concretos, e podem ser passadas mensagens
(chamar aos mtodos) para que faam coisas.
Construtores em PHP 5
Vamos ver o que um construtor e para que serve, alm de um exemplo simples de uma
classe que define um construtor.

Os construtores se encarregam de resumir as aes de iniciao dos objetos. Quando instanciamos


um objeto, temos que realizar vrios passos em sua iniciao, por exemplo, dar valores a seus atributos e
isso o que se encarrega o construtor. Os construtores podem receber dados para iniciar os objetos como
se deseje em cada caso.

A sintaxe para a criao de construtor varia em relao a do PHP 3 e 4, pois deve se chamar com um
nome fixo: __construct. (So dois hfens baixos(underline), antes da palavra "construct")

A longo dos exemplos deste manual vamos ir criando um cdigo para gesto de um vdeo club.
Vamos comear definindo uma classe cliente, que utilizaremos logo em nosso programa.

class cliente{
var $nome;
var $numero;
var $filmes_alugados;

function __construct($nome,$numero){
$this->nome=$nome;
$this->numero=$numero;
$this->filmes_alugados=array;
}

function dame_numero{
return $this->numero;
}
}

O construtor nesta classe recebe o nome e nmero que atribuir ao cliente, que introduz logo em suas
correspondentes propriedades. Ademais inicia o atributo filmes_alugados como um array, neste caso vazio
porque ainda no tem nenhum filme em seu poder.

Logo, criamos um mtodo muito simples para poder utilizar o objeto. Vamos ver umas aes simples
para ilustrar o processo de instanciao e utilizao dos objetos.

//instanciamos dois objetos cliente


$cliente1 = new cliente("Pedro", 1);
$cliente2 = new cliente("Roberto", 564);

//mostramos o numero de cada cliente criado


"O identificador do cliente 1 : " . $cliente1->dame_numero;
"O identificador do cliente 2 : " . $cliente2->dame_numero;

Este exemplo obteria esta sada como resultado de sua execuo:

O identificador do cliente 1 : 1
O identificador do cliente 2 : 564

Destrutores em PHP 5
Explicao dos destrutores em PHP5 e exemplos de funcionamento.

Os destrutores so funes que se encarregam de realizar as tarefas que se necessita executar


quando um objeto deixa de existir. Quando um objeto j no est referenciado por nenhuma varivel, deixa
de ter sentido que esteja armazenado na memria, portanto, o objeto deve ser destrudo para liberar seu
espao. No momento de sua destruio, a funo se chama destrutor, que pode realizar as tarefas que o
programador estime oportuno realizar.
A criao do destrutor opcional. Somente devemos cri-lo, se desejarmos fazer alguma coisa
quando um objeto se elimine da memria.

O destrutor como qualquer outro mtodo da classe, embora deve se declarar com um nome fixo:
__destruct.

No cdigo seguinte veremos um destrutor em funcionamento. Embora a ao que se realiza ao


destruir o objeto no muito til, pode nos servir bem para ver como trabalha.

class cliente{
var $nome;
var $numero;
var $filmes_alugados;

function __construct($nome,$numero){
$this->nome=$nome;
$this->numero=$numero;
$this->filmes_alugados=array;
}

function __destruct{
"<br>destruido: " . $this->nome;
}

function dame_numero{
return $this->numero;
}
}

//instanciamos dois objetos cliente


$cliente1 = new cliente("Pedro", 1);
$cliente2 = new cliente("Roberto", 564);

//mostramos o numero de cada cliente criado


"O identificador do cliente 1 : " . $cliente1->dame_numero;
"<br>O identificador do cliente 2 : " . $cliente2->dame_numero;

Este cdigo igual que o anterior. Somente acrescentamos o destrutor, que imprime uma mensagem
na tela com o nome do cliente que foi destrudo. Depois de sua execuo obteramos a seguinte sada.

O identificador do cliente 1 : 1
O identificador do cliente 2 : 564
destrudo: Pedro
destrudo: Roberto

Como vimos, antes de acabar o script, libera-se o espao na memria dos objetos, com o qual se
executa o destrutor e aparece a correspondente mensagem na pgina.

Um objeto pode ficar sem referncias e, portanto, ser destrudo, por muitas razes. Por exemplo, o
objeto pode ser uma varivel local de uma funo e ao finalizar a execuo dessa funo local deixaria de
ter validade, sendo ento destrudo.

O cdigo seguinte ilustra como uma varivel local a qualquer mbito (por exemplo, local a uma
funo), se destri quando esse mbito foi finalizado.

function cria_cliente_local{
$cliente_local = new cliente("sou local", 5);
}
cria_cliente_local

A funo simplesmente cria uma varivel local que contem a instanciao de um cliente. Quando a
funo se acaba, a varivel local deixa de existir, e ento, chama-se ao destrutor definido para esse objeto.
Nota: Tambm podemos nos desfazer de um objeto sem a necessidade de acabar com o mbito
onde foi criado. Para isso, temos a funo unset que recebe uma varivel e a elimina da memria. Quando
se perde uma varivel que contem um objeto e esse objeto deixa de ter referncias, elimina-se ao objeto e
chama-se ao destrutor.

Modificadores de acesso a mtodos e propriedades em PHP


So os Public, Protected e Private, que se podem conhecer porque j se utilizam e outras
linguagens orientados a objetos.

Veremos neste captulo os novos modificadores de acesso aos mtodos e atributos dos objetos que
foram incorporados em PHP 5. Estes modificadores de acesso so os conhecidos public, protected e
private, que j dispem de outras linguagens como Java.

Um dos princpios da programao orientada a objetos o encapsulamento, que um processo no


qual se ocultam as caractersticas internas de um objeto queles elementos que no tm porque conhece-
las. Os modificadores de acesso servem para indicar as permisses que tero outros objetos para acessar a
seus mtodos e propriedades.

Modificador public

o nvel de acesso mais permissivo. Serve para indicar que o mtodo ou atributo da classe pblico.
Neste caso pode-se acessar a este atributo, para visualiz-lo ou edita-lo, por qualquer outro elemento de
nosso programa. o modificador que se aplica se no se indica outra coisa.

Vejamos um exemplo de classe onde declaramos como public seus elementos, um mtodo e uma
propriedade. Trata-se da classe "dado", que tem um atributo com sua pontuao e um mtodo para tirar o
dado o obter uma nova pontuao aleatria.

class dado{
public $pontos;

function __construct{
srand((double)microtime*1000000);
}

public function tirar{


$this->pontos=$randval = rand(1,6);
}
}

$meu_dado = new dado;

for ($i=0;$i<30;$i++){
$meu_dado->tirar;
"<br>Saiu " . $meu_dado->pontos . " pontos";
}

Vemos a declarao da classe dado, e logo umas linhas de cdigo para ilustrar seu funcionamento.
No exemplo se realiza um loop 30 vezes, nas quais se tira o dado e se mostra a pontuao que se obteve.

Como o atributo $pontos e o mtodo tirar so pblicos, podemos acess-los de fora do objeto, ou que
o mesmo, de fora do cdigo da classe.

Modificador private

o nvel de acesso mais restritivo. Serve para indicar que essa varivel somente vai poder ser
acessada pelo prprio objeto, nunca de fora. Se tentarmos acessar um mtodo ou atributo declarado private
de fora do prprio objeto, obteremos uma mensagem de erro indicando que no possvel a este elemento.

Se no exemplo anterior tivssemos declarado private o mtodo e a propriedade da classe dado,


teramos recebido uma mensagem de erro.
Aqui temos outra possvel implementao da classe dado, declarando como private o atributo pontos
e o mtodo tirar.

class dado{
private $pontos;

function __construct{
srand((double)microtime*1000000);
}

private function tirar{


$this->pontos=$randval = rand(1,6);
}

public function dar_nova_pontuacao{


$this->tirar;
return $this->pontos;
}
}

$meu_dado = new dado;

for ($i=0;$i<30;$i++){
"<br>Han salido " . $meu_dado->dar_nova_pontuacao . " pontos";
}

Tivemos que criar um novo mtodo pblico para operar com o dado, porque se tudo privado no h
forma de fazer uso dele. O mencionado mtodo dar_nova_pontuacao, que realiza a ao de tirar o dado e
devolver o valor que saiu.

Modificador protected

Este indica nvel de acesso mdio e um pouco mais especial que os anteriores. Serve para que o
mtodo ou o atributo seja pblico dentro do cdigo da prpria classe e de qualquer classe que herde
daquela onde est o mtodo ou propriedade protected. privado e no acessvel de qualquer outra parte.
Ou seja, um elemento protected pblico dentro da prpria classe e em suas heranas.

Mais adiante explicaremos a herana e poderemos oferecer exemplos com o modificador protected.

Concluso

Muitas vezes o prprio desenvolvedor o que fixa seu critrio na hora de aplicar os distintos
modificadores de acesso a atributos e mtodos. Pouca proteo implica que os objetos percam seu
encapsulamento e com isso, uma das vantagens da POO. Uma proteo maior pode tornar mais trabalhoso
gerar o cdigo do programa, mas em geral, aconselhvel.

A herana em PHP5
Explicamos a herana em PHP 5, um processo pelo qual os objetos podem herdar as
caractersticas de outros, de modo que se podem fazer objetos especializados, baseados em outros
mais gerais.

A herana um dos mecanismos fundamentais da programao orientada a objetos. Por meio da


herana, podem se definir classes a partir da declarao de outras classes. As classes que herdam incluem
os mtodos como as propriedades da classe a partir da qual esto definidos.

Por exemplo, pensemos na classe "veculo". Esta classe geral pode incluir as caractersticas gerais
de todos os veculos (atributos da classe), como a matrcula, ano de fabricao e potncia. Ademais, incluir
algumas funcionalidades (mtodos da classe) como poderiam ser, ligar ou mover.

Agora tambm, na prtica existem vrios tipos de veculos, como os carros, os nibus e os
caminhes. Todos eles tm umas caractersticas comuns, que foram definidas na classe veculo. Ademais,
tero uma srie de caractersticas prprias do tipo de veculo, que, princpio, no tm outros tipos de
veculos. Por exemplo, os caminhes podem ter uma carga mxima permitida ou os nibus um nmero de
lugares disponveis. Da mesma forma, as classes mais especficas podem ter umas funcionalidades
prprias, como os caminhes carregar e descarregar, ou os nibus aceitar_passageiros ou
vender_passagem.

O normal em sistemas de herana que as classes que herdam de outras incluam novas
caractersticas e funcionalidades, parte dos atributos e mtodos herdados. Porm, isto no
imprescindvel, de modo que podem se criar objetos que herdem de outros e no incluam nada novo.

Sintaxe de herana em PHP 5

A programao orientada a objetos nos oferece uma srie de mecanismos para definir este tipo de
estruturas, de modo que possam se criar hierarquias de objetos que herdam uns de outros. Veremos agora
como definir estas estruturas de herana em PHP 5. Para isso, continuando com nosso exemplo da
locadora de vdeo, vamos criar os distintos tipos de elementos que so oferecidos no aluguel.

Como todo mundo conhece, as locadoras de vdeos oferecem distintos tipos de elementos para
alugar, como podem ser os filmes (fitas de vdeo ou DVD) e os jogos. Cada elemento tem umas
caractersticas prprias e algumas comuns. Chamamos "suporte" classe geral, que inclui as
caractersticas comuns para todos os tipos de elementos em aluguel. Logo, criamos trs tipos de suportes
diferentes, que herdam da classe suporte, mas que incluem algumas caractersticas e funcionalidades
novas. Estes tipos de suporte sero "fita_video", "dvd" e "jogo".

O esquema de herana que vamos realizar neste exemplo pode ser visto na seguinte imagem.

Comeamos pela classe suporte. Seu cdigo ser o seguinte:

class suporte{
public $titulo;
protected $numero;
private $preco;

function __construct($tit,$num,$preco){
$this->titulo = $tit;
$this->numero = $num;
$this->preco = $precio;
}

public function dar_preco_sem_imposto{


return $this->preco;
}

public function dar_preco_com_imposto{


return $this->preco * 1.16;
}
public function dar_numero_identificacao{
return $this->numero;
}
public function imprime_caracteristicas{
echo $this->titulo;
echo "<br>" . $this->preco . " (imposto nao incluido)";
}
}

Os atributos que definimos so, ttulo, nmero (um identificador do suporte) e preo. Aplicamos a
cada um, um modificador de acesso distinto, para poder praticar os diferentes tipos de acesso.

Definimos um constructor, que recebe os valores para a iniciao do objeto. Um mtodo


dar_preco_sim_imposto, que devolve o preo do suporte, sem aplicar o imposto. Outro mtodo
dar_preco_com_imposto, que devolve o preo uma vez aplicado por exemplo, 16% de imposto. O mtodo
dar_numero_identificacao, que devolve o nmero de identificador e imprime_caracteristicas, que mostra na
pgina as caractersticas deste suporte.

Nota: Como se foi definido como private o atributo preo, este atributo s poder ser acessado dentro
do cdigo da classe, ou seja, na prpria definio do objeto. Se quisermos acessar ao preo de fora da
classe (algo muito normal se temos em conta que vamos necessitar o preo de um suporte de outras partes
da aplicao) ser necessrio criar um mtodo que nos devolva o valor do preo. Este mtodo devera se
definir como public, para que possa ser acessado de qualquer lugar que se necessite.

Em todos os mtodos usa-se a varivel $this. Esta varivel no mais que uma referncia ao objeto
sobre o qual se est executando o mtodo. Em programao orientada a objetos, para executar qualquer
destes mtodos, primeiro temos que ter criado um objeto a partir de uma classe. Logo, poderemos chamar
os mtodos de um objeto. Isto se faz com $meu_objeto->metodo_a_chamar. Dentro de mtodo, quando se
utiliza a varivel $this, se est fazendo referncia ao objeto sobre o qual se chamou ao mtodo, neste caso,
o objeto $meu_objeto. Com $this->titulo estamos fazendo referncia ao atributo "titulo" que tem o objeto
$meu_objeto.

Se quisermos provar a classe suporte, para confirmar que se executa corretamente e que oferece
resultados coerentes, podemos utilizar um cdigo como o seguinte.

$suporte1 = new suporte("Os Intocveis",22,3);


echo "<b>" . $suporte1->titulo . "</b>";
echo "<br>Preco: " . $suporte1->dar_preco_sem_imposto . "euros";
echo "<br>Preco imposto includo: " . $suporte1->dar_preco_com_imposto . "
euros";

Neste caso criamos uma instncia da classe suporte, em um objeto que chamamos $suporte1. Logo,
imprimimos seu atributo titulo (como o ttulo foi definido como public, podemos acessa-lo desde fora do
cdigo da classe.
Logo, chamam-se aos mtodos dar_preco_sem_imposto e dar_preco_com_imposto para o objeto
criado.

Dara isto como resultado:

Os Intocveis
Preo: 3 euros
Preo imposto includo: 3,48 euros

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

Você também pode gostar