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. Referimonos 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.
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/
__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, utilizase 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.
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.
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);
}
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.
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;
}
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
"