Escolar Documentos
Profissional Documentos
Cultura Documentos
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.
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.
Nota: A verso dos software acima so referentes at a data de criao desta apostila.
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.
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.
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/
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.
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.
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
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.
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.
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.
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.
O destrutor como qualquer outro mtodo da classe, embora deve se declarar com um nome fixo:
__destruct.
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;
}
}
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.
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.
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);
}
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.
class dado{
private $pontos;
function __construct{
srand((double)microtime*1000000);
}
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.
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.
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.
class suporte{
public $titulo;
protected $numero;
private $preco;
function __construct($tit,$num,$preco){
$this->titulo = $tit;
$this->numero = $num;
$this->preco = $precio;
}
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.
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.
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.
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.
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:
function __construct($tit,$num,$preco,$duracao){
parent::__construct($tit,$num,$preco);
$this->duracao = $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.
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.
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