Você está na página 1de 67

Tcnico em Informtica

Orientao a Objetos

Bruno Silva

2015

Presidenta da Repblica
Dilma Vana Rousseff

Governador do Estado de Pernambuco


Paulo Henrique Saraiva Cmara

Vice-presidente da Repblica
Michel Temer

Vice-governador
Raul Jean Louis Henry Jnior

Ministro da Educao
Cid Ferreira Gomes

Secretrio de Educao
Frederico da Costa Amancio

Secretrio de Educao Profissional e


Tecnolgica
Alssio Trindade de Barros

Secretrio Executivo de Educao Profissional


Paulo Fernando de Vasconcelos Dutra
Gerente Geral de Educao Profissional
Josefa Rita de Cssia Lima Serafim

Diretor de Integrao das Redes


Marcelo Machado Feres

Coordenador de Educao a Distncia


George Bento Catunda

Coordenao Geral de Fortalecimento


Carlos Artur de Carvalho Aras
Coordenador Rede e-Tec Brasil
Cleanto Csar Gonalves

Coordenao do Curso
Joo Ferreira
Coordenao de Design Instrucional
Diogo Galvo
Reviso de Lngua Portuguesa
Letcia Garcia
Diagramao
Izabela Cavalcanti

Sumrio
INTRODUO .......................................................................................................................3
1.COMPETNCIA 01 | PRINCPIOS E IMPORTNCIA DA ORIENTAO A OBJETOS .................4
1.1 Histrico e Comparao com Linguagens Estruturadas ....................................... 4
1.2 Exemplo: Programao Estruturada Versus POO ................................................ 7

2.COMPETNCIA 02 | CONCEITOS DE CLASSE, HERANA, OBJETO, ATRIBUTO E MTODO .14


2.1 Conceitos Fundamentais .................................................................................. 14
2.2 Atributos .......................................................................................................... 15
2.3 Mtodos........................................................................................................... 16
2.4 Trabalhando com Objetos ................................................................................ 17
2.5 Inicializando Objetos ........................................................................................ 18
2.6 Construtor ........................................................................................................ 18
2.7 O Operador $this .............................................................................................. 20
2.8 Atributos e Mtodos Estticos .......................................................................... 22

3.COMPETNCIA 03 | CONCEITOS DE ASSOCIAO, ENCAPSULAMENTO, ABSTRAO,


POLIMORFISMO E INTERFACE ............................................................................................ 24
3.1 Herana............................................................................................................ 24
3.2 Modificadores de Acesso .................................................................................. 31
3.3 Mtodos Get e Set............................................................................................ 34
3.4 Classes Abstratas .............................................................................................. 36
3.5 Interfaces ......................................................................................................... 39

4.COMPETNCIA 04| UTILIZANDO TCNICAS DE ORIENTAO A OBJETOS EM UMA


APLICAO......................................................................................................................... 41
4.1 Conectando ao MySQL ..................................................................................... 42
4.2 Classe Bsica Filme ........................................................................................... 45
4.3 Repositrio de Dados ....................................................................................... 46
4.4 Listando Dados ................................................................................................. 50
4.5 Incluindo Novos Filmes ..................................................................................... 53
4.6 Removendo Filmes ........................................................................................... 54
4.7 Alterando Filmes .............................................................................................. 55

CONCLUSO .......................................................................................................................59
REFERNCIAS .....................................................................................................................60
MINICURRCULO DO PROFESSOR .......................................................................................61

INTRODUO
Prezado (a) aluno (a),
Com programao podemos construir diversos aplicativos para facilitar e
enriquecer nossas experincias do dia a dia. Esta disciplina visa justamente
mostrar a vocs como construir sistemas que tm como meio as pginas web,
utilizando o paradigma orientado a objetos.
Ela tambm pretende ampliar os conceitos aprendidos na matria de
programao em PHP, pois utiliza a noo de orientao a objetos como
forma de modelar os problemas a serem resolvidos. Desta forma, este
caderno apresenta um material introdutrio sobre programao orientada a
objetos (OO) utilizando a linguagem PHP. Portanto, essencial que voc
entenda bem os conceitos bsicos da linguagem PHP e seja capaz de criar
programas nesta linguagem, utilizando um ambiente de programao e teste.
Ento, caso nas disciplinas anteriores tenha ficado alguma dvida, releia os
cadernos de estudo e procure na internet outras explicaes para ajudar na
compreenso. O sucesso depende de sua dedicao.
O contedo do caderno dividido em quatro partes principais.
Introduo, onde so apresentados de forma introdutria os conceitos
fundamentais do paradigma orientado a objetos e um pouco de sua histria.
Orientao a Objetos, na qual so mostrados os conceitos fundamentais do
paradigma OO como, por exemplo, mtodos e atributos.
Conceitos relacionados reutilizao de cdigo onde so mostradas tcnicas
de reutilizao de cdigo largamente utilizadas nesse tipo de paradigma
(Orientada a Objetos).
Por fim, uma atividade de projeto proposta para que voc aplique os
conhecimentos aprendidos nesta disciplina.

Orientao a Objetos

Competncia 01
1.COMPETNCIA 01 |
ORIENTAO A OBJETOS

PRINCPIOS

IMPORTNCIA

DA

Este material apresenta uma introduo sobre programao orientada a


objetos, utilizando a linguagem de programao PHP. Neste material,
assumiremos que o leitor possua conhecimentos prvios relacionados
programao web (HTML, CSS, PHP estruturado).
Para pessoas que sabem programar em uma linguagem de programao
estruturada, como C ou PHP bsico, pode surgir uma pergunta.
Por que eu aprenderia uma forma diferente de programar (i.e., utilizando
objetos), se at ento nunca surgiu essa necessidade?
Se o projeto envolver muitas funcionalidades (muitas rotinas) e algumas delas
possurem um comportamento similar, a orientao a objetos uma boa
alternativa a ser utilizada nesse projeto. A utilizao de orientao a objetos
permite ao sistema uma maior reusabilidade, manutenibilidade e qualidade
do cdigo.
1.1 Histrico e Comparao com Linguagens Estruturadas
Em 2004, o modelo de programao orientado a objetos foi adicionado ao
PHP 5 e permitiu que aplicaes WEB complexas fossem desenvolvidas de
uma forma simples, modular e reutilizvel.
Com o surgimento do release PHP 5, programadores finalmente tinham o
mesmo poder de programao que linguagens proeminentes como o Java e
C#. Desta forma, PHP finalmente possuiria uma infraestrutura de
programao orientada a objetos (POO) completa.
Em linguagens estruturadas costumamos programar tentando reproduzir a

Tcnico em Informtica

Competncia 01
forma como um computador pensa. Ou seja, programamos uma sequncia
de comandos para executar a programao. A partir da execuo dessa
sequncia de comandos, temos o resultado da computao.
Por outro lado, a linguagem de programao orientada a objetos um
paradigma de computao que se assemelha forma de pensar dos seres
humanos. Para realizar a computao, ao invs de uma srie de comandos,
utilizamos objetos que possuem dados associados e se comunicam entre si.
Durante os anos 70 e 80, a metodologia de engenharia de software
predominante era a programao estruturada, que se baseava nos seguintes
princpios: sequncia, deciso e interao.
A sequncia quer dizer a ordem principal de execuo de um programa, ou
seja, o conjunto de passos para execuo do programa. A deciso envolve
questes que possam surgir no meio do caminho. Geralmente, existe um fluxo
principal na execuo do programa, mas pode haver desvios. Os mecanismos
de deciso auxiliam nessa tarefa. J a iterao permite que uma mesma
funo seja chamada vrias vezes durante a execuo do programa.
Abaixo, uma das formas de resolver certo problema utilizando o modelo de
programao estruturada.
Para resolver um problema complexo, quebre este problema em pequenas
partes e trabalhe nessas partes separadamente.
Para resolver cada parte, trate este problema como um novo problema e se
possvel quebre este em novos subproblemas.
Repita este processo at que cada subparte esteja resolvida e junte todo o
resultado.

Orientao a Objetos

Competncia 01
Essa abordagem de programao tambm conhecida como abordagem topdown (cima para baixo). Apesar de ser uma tcnica bastante til na escrita de
cdigo estruturado, a abordagem top-down possui algumas limitaes como
listadas a seguir.
Esta focada quase que inteiramente em produzir instrues necessrias
para se resolver um problema. A modelagem das estruturas de dados que
compe o problema geralmente deixada em segundo plano na fase de
projeto do sistema.
bastante complicado reutilizar um cdigo escrito utilizando essa abordagem
em outros projetos, dado que os problemas a serem resolvidos so bastante
especficos para o domnio do sistema projetado.
Dadas essas limitaes tcnicas, os engenheiros da poca combinaram
tcnicas top-down com abordagens bottom-up (de baixo para cima). Nesse
tipo de projeto (bottom-up), problemas similares so reutilizados em outras
partes de cdigo, fazendo com que estes sejam resolvidos utilizando o mesmo
trecho de cdigo. Assim, os componentes do sistema se tornavam o mais
modular possvel, considerando que um mdulo um componente que
interage com o resto do sistema de uma forma simples e bem definida.
A ideia bsica a de que um mdulo seja facilmente plugado ao sistema.
Portanto, para que um mdulo seja utilizado, deve-se conhecer a sua forma
de interao com outros componentes (tambm conhecida como interface do
sistema), ou seja, quais os parmetros necessrios para utilizar este mdulo e
quais as funcionalidades que este mdulo disponibiliza.
No incio dos anos 80, foi criada a programao orientada a objetos (POO), na
qual mdulos guardavam estruturas de dados de forma protegida e com
interface bem definida. O conceito chave da abordagem POO o objeto, que
um tipo de mdulo que possui uma estrutura de dados e sub-rotinas

Tcnico em Informtica

Competncia 01
associados. Assim, um objeto um tipo de entidade autossuficiente que
possui um estado interno (seus dados constituintes) e que pode responder a
mensagens (chamadas e sub-rotinas).
Para resolver um determinado problema utilizando a abordagem POO devese:

Identificar os objetos envolvidos no problema;


Identificar as mensagens que so trocadas entre esses objetos.

A soluo do problema vai resultar em um conjunto de objetos que possuem


o seu prprio dado associado e um conjunto de responsabilidades. Os objetos
interagem entre si por meio de troca de mensagens. As principais vantagens
desse tipo de modelo de programao so:

Facilidade na escrita do programa;


Facilidade de entendimento do cdigo;
Menor quantidade de erros (no caso geral);
Alto ndice de reuso de cdigo.

1.2 Exemplo: Programao Estruturada Versus POO


Suponha que voc queira criar um sistema que calcule o valor dos descontos
mensais de um funcionrio de uma locadora de filmes. Por simplicidade, ser
assumido que o trabalhador ir pagar o Imposto de Renda calculado como
27,5% do salrio bruto mais a contribuio da Previdncia Social, que varia de
trabalhador pra trabalhador. Sero exibidas vrias formas de se calcular os
descontos no salrio deste funcionrio.

Para conhecer um
pouco mais sobre o
histrico das
linguages
orientadas a
objetos acesse:
http://pt.wikibooks.
org/wiki/Programa
%C3%A7%C3%A3o_
Orientada_a_Objet
os/Introdu%C3%A7
%C3%A3o e
http://social.stoa.us
p.br/poo2013pos/a
ulas/aula-2-historiada-programacaoorientada-a-objetos

Orientao a Objetos

Competncia 01
Exemplo 1
<?php
$joaoSalario
= 1000;
$joaoPrevidencia = 100;
$joaoNome
= "Joo Filho";
$joaoDescontos
=
round($joaoSalario*0.275 + $joaoPrevidencia,2);
$mariaSalario
= 2000;
$mariaPrevidencia = 200;
$mariaNome
= "Maria Rute";
$mariaDescontos
=
round($mariaSalario*0.275 + $mariaPrevidencia,2);
$joseSalario
= 3000;
$josePrevidencia = 400;
$joseNome
= "Jos Salgado";
$joseDescontos
=
round($joseSalario*0.275 + $josePrevidencia,2);
echo "O valor do desconto de $joaoNome $joaoDescontos. <br>";
echo "O valor do desconto de $mariaNome $mariaDescontos. <br>";
echo "O valor do desconto de $joseNome $joseDescontos. <br>";
?>

O resultado da execuo desse cdigo mostrado a seguir:


O valor do desconto de Joo Filho 375.
O valor do desconto de Maria Rute 750.
O valor do desconto de Jos Salgado 1225.

Observe que todas


as vezes em que
precisarmos
calcular os
descontos de um
novo funcionrio,
um novo clculo
deve ser
adicionado. Se a
forma de calcular o
salrio do
trabalhador for
mudada, essa
alterao ter que
ser feita em muitos
lugares diferentes.

Tcnico em Informtica

Competncia 01
Exemplo 2
<?php
function calcularDescontos($salario, $previdencia)
{
return round($salario*0.275 + $previdencia,2);
}

$joaoNome
= "Joo Filho";
$joaoDescontos
=
calcularDescontos(1000, 100);
$mariaNome
= "Maria Rute";
$mariaDescontos
=
calcularDescontos(2000, 200);
$joseNome
= "Jos Salgado";
$joseDescontos
=
calcularDescontos(3000, 300);
echo "O valor do desconto de $joaoNome $joaoDescontos. <br>";
echo "O valor do desconto de $mariaNome $mariaDescontos. <br>";
echo "O valor do desconto de $joseNome $joseDescontos. <br>";
?>

Neste exemplo, criamos uma funo para calcular os descontos do


funcionrio ao invs de repetir o clculo vrias vezes. A sada do programa
permanece a mesma que a mostrada no exemplo anterior, contudo a
informao associada aos salrios e previdncia de cada funcionrio perdida
quando a rotina calcular descontos chamada.
Alm disso, caso o nmero de funcionrios dessa empresa fosse grande, seria
bastante complicado manipular as variveis relativas a cada funcionrio.
Assim, uma estrutura como array seria til para guardar o conjunto de
funcionrios dessa empresa. O cdigo a seguir apresenta essa mesma
implantao, utilizando arrays.

Orientao a Objetos

Competncia 01
Exemplo 3
<?php
function calcularDescontos($salario, $previdencia)
{
return round($salario*0.275 + $previdencia,2);
}
$funcionarios = array();
$funcionarios[0] = array("Joo Filho", 1000, 100);
$funcionarios[1] = array("Maria Rute", 2000, 200);
$funcionarios[2] = array("Jos Salgado", 3000, 300);
for($i = 0; $i < count(funcionarios); $i++)
{
$nome = funcionarios[$i][0];
$descontos = calcularDescontos(funcionarios[$i][1],
funcionarios[$i][2]);
echo "O valor do desconto de $nome $descontos. <br>";
?>

Este exemplo mostra uma forma mais elaborada de calcular o mesmo salrio
do funcionrio da locadora. Apesar do cdigo do Exemplo 3 possuir pouca
repetio de cdigo, este ainda no pode ser considerado um mdulo
reutilizvel do sistema. Isso se deve ao fato de os dados serem agrupados sem
uma formatao bem definida e a rotina de calcular descontos no estar
associada a um funcionrio especfico.
O cdigo que ser apresentado a seguir mostra como esse problema
resolvido utilizando orientao a objetos.

10

Tcnico em Informtica

Competncia 01
Exemplo 4
<?php
class Funcionario{
$nome;
$salario;
$previdencia;
$descontos;
function __construct($nome, $salario, $previdencia)
{
$this->nome = $nome;
$this->salario = $salario;
$this->previdencia = $previdencia;
$this->descontos = $this->calcularDescontos();
}
function calcularDescontos()
{
return round($this->salario*0.275 + $this->previdencia,2);
}
}
$funcionarios = array();
$funcionarios[0] = new Funcionario("Joo Filho", 1000, 100);
$funcionarios[1] = new Funcionario("Maria Rute", 2000, 200);
$funcionarios[2] = new Funcionario("Jos Salgado", 3000, 300);
for($i = 0; $i < count($funcionarios); $i++)
{
$func = $funcionarios[$i];
echo "O valor do desconto de $func->nome $func->descontos
}
?>

<br>";

Observe que para esse exemplo especfico (Exemplo 4) a classe Funcionario


foi criada. Essa classe descreve quais as caractersticas de cada objeto em
termos de propriedades (atributos) e funcionalidades (mtodos). Nesse caso,
os atributos da classe Funcionario so nome, salrio base e previdncia e o
mtodo calcularDescontos.
Dessa forma, para cada funcionrio existe um nmero de previdncia, nome e
nmero associado. Maiores detalhes sobre a criao de classes, atributos e

11

Orientao a Objetos

Competncia 01
mtodos sero discutidos na prxima seo. O mtodo __construct ser
detalhado nas sees posteriores. Porm, por enquanto, basta saber que este
mtodo inicializa os atributos da classe Funcionario. Por exemplo, para o
funcionrio Joo Filho, o construtor chamado passando os parmetros
Funcionario("Joo Filho", 1000, 100).
Exemplo 5
Assuma agora que o cargo do funcionrio seja dependente do salrio que este
ganha. Portanto, para funcionrios com salrio entre 1000 e 1999 teremos
um colaborador jnior. Para salrios maiores ou iguais a 2000 e menores que
2999, o funcionrio pleno e se o salrio for maior ou igual a 3000 temos um
funcionrio snior.
Como o tipo do funcionrio ser definido na sua criao, podemos definir o
tipo de funcionrio utilizando o mtodo construtor para fazer tal operao. O
trecho de cdigo abaixo apresenta o cdigo que realiza essas operaes.

Exerccio
Utilize como base
os exemplos
anteriores e
construa dois
programas PHP (um
de forma
estruturada e outro
orientado a
objetos) que
calculem o IMC de
uma determinada
pessoa. O clculo
do IMC avaliado
como peso dividido
pela altura ao
quadrado.

12

Tcnico em Informtica

Competncia 01
<?php
class Funcionario{
public $nome;
public $salario;
public $previdencia;
public $descontos;
public $tipoFuncionario;
function __construct($nome, $salario, $previdencia) {
$this->nome = $nome;
$this->salario = $salario;
$this->previdencia = $previdencia;
$this->descontos = $this->calcularDescontos();
if($this->salario >= 1000 && $this->salario < 2000) {
$this->tipoFuncionario = "Jnior";
}
else if($this->salario >= 2000 && $this->salario < 3000) {
$this->tipoFuncionario = "Pleno";
}
else if($this->salario >= 3000) {
$this->tipoFuncionario = "Snior";
}
}
function calcularDescontos(){
return round($this->salario*0.275 + $this->previdencia,2);
}

Nos links a seguir o


aluno poder
visulalizar outras
explicaes que
mostram a
diferena entre o
paradigma
estruturado e
orientado a objetos.
http://fabrica.ms.se
nac.br/2013/04/pro
gramacaoestruturada-versusprogramacaoorientada-aobjetos/
www.devmedia.co
m.br/programacaoorientada-aobjetos-xprogramacaoestruturada/11747

}
$funcionarios = array();
$funcionarios[0] = new Funcionario("Joo Filho", 1000, 100);
$funcionarios[1] = new Funcionario("Maria Rute", 2000, 200);
$funcionarios[2] = new Funcionario("Jos Salgado", 3000, 300);
for($i = 0; $i < count($funcionarios); $i++)
{
$func = $funcionarios[$i];
echo "O valor do desconto de $func->nome $func->descontos
e seu tipo $func->tipoFuncionario<br>";
}
?>

Videos
demonstrativo
sobre diferena
entre programao
estrutura e
orientada a objetos.
www.youtube.com/
watch?v=vhvmZfxZ
hPw
www.youtube.com/
watch?v=PmefpISZ7
Ew

13

Orientao a Objetos

Competncia 02
2.COMPETNCIA 02 | CONCEITOS DE CLASSE, HERANA, OBJETO,
ATRIBUTO E MTODO
Esta seo aborda os conceitos fundamentais do paradigma de programao
orientado a objetos. Embora os conceitos aqui estejam sendo apresentados
com uso da linguagem PHP, os assuntos abordados so genricos e podem ser
extrapolados para outras linguagens orientadas a objetos.
2.1 Conceitos Fundamentais
Objetos so pores de software, descritos por variveis e mtodos. Objetos
em software modelam os objetos do mundo real atravs do seu
comportamento e seus componentes. Em linguagem estruturada, at ento,
vimos os conceitos de atributos e mtodos. Por outro lado, quando falamos
em componentes de um objeto temos mtodos (relativos s funes) e
atributos (relativos s variveis).
Na prtica, um objeto uma representao em memria do computador de
uma entidade do mundo real.
O que uma classe?
Classe o modelo ou prottipo que define as variveis e mtodos comuns a
um conjunto de objetos de certo tipo. Em geral, uma classe define como
cada objeto, sua estrutura e seu comportamento, enquanto os objetos so as
entidades vivas dentro do programa. Uma classe pode ter vrios
representantes (objetos) dentro de um mesmo programa, cada objeto com
seus atributos em particular.

14

Tcnico em Informtica

Competncia 02
As classes normalmente tm a seguinte forma (Exemplo 6):
Exemplo 6
<?php
#class [NomeDaClasse] {
#
[lista de atributos]
#
[lista de mtodos]
#}
//Exemplo:
class Conta{
public $numero;
public $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}
}
?>

No corpo da classe h basicamente trs componentes bsicos: Atributos,


Construtores e Mtodos.
2.2 Atributos
Tambm conhecidos como variveis de instncia descrevem as
caractersticas dos objetos.
O tempo de vida dos atributos igual ao tempo de vida do objeto.
Cada objeto tem seus prprios valores de atributos em tempo de
execuo.
No Exemplo 6, os atributos da classe Conta so nmero e saldo e definem os
dados associados a este objeto. Portanto, em uma aplicao de banco, para o
nosso exemplo, toda conta possuir nmero e saldo associados. Os valores
dos atributos so especficos para cada objeto e podem ou no coincidir com

15

Orientao a Objetos

Competncia 02
algum outro objeto criado, dependendo de cada projeto.
2.3 Mtodos
Os mtodos so os componentes da classe que realizam as computaes
(funes).
Mtodos recebem parmetros, ou seja, valores para que podem ser
utilizados durante a computao.
Pode ou no retornar um resultado, assim como funes no associadas a
mtodos.
Exemplo 7
<?php
#[modificadores] function [nome do metodo]([lista de parametros])
//Exemplo:
class ContaCliente{
public $numero;
public $saldo;
function creditar($valor)
{
$this->saldo = $this->saldo + $valor;
}
}
?>

Os mtodos possuem uma assinatura, que correspondem a uma descrio do


que o mtodo deve faze e ainda os valores necessrios para a computao e o
retorno da computao. A forma bsica da assinatura dos mtodos
mostrada no Exemplo 7. No caso da funo creditar um determinado valor,
recebido como parmetro e adicionado ao saldo atual da conta.

16

Tcnico em Informtica

Competncia 02
Assim como funes que no so associadas a objetos, a lista de parmetros
de um mtodo pode ser vazia. Para retornar um resultado de um mtodo,
basta adicionar a sentena result no final do mtodo (observe o Exemplo 8).
Aps a criao do objeto calculadora ($calc = new Calculadora();) a funo
somar chamada e o resultado impresso na tela.
Exemplo 8
<?php
class Calculadora{
function somar($operador1, $operador2){
return $operador1 + $operador2;
}
}
$calc = new Calculadora();
$soma = $calc->somar(2, 2);
echo "SOMA : $soma";
?>

Sada:
SOMA : 4

Para conhecer um
pouco mais sobre
classes e objetos
em PHP acesse.
http://php.net/man
ual/pt_BR/language
.oop5.basic.php

2.4 Trabalhando com Objetos


Em PHP, uma varivel inicializada como objeto guarda uma referncia para o
mesmo e pode ser utilizada para invocar seus mtodos e alterar/visualizar
seus atributos. A Figura 1 apresenta uma representao grfica de como uma
varivel que aponta para um objeto (referncia) esquematizada na memria
do computador.

Veja tambm esse


vdeos:
www.youtube.com/
watch?v=9bQNsfYq
Vc4
www.youtube.com/
watch?v=UM9YBFqI
wQ4

17

Orientao a Objetos

Competncia 02

Figura 1 - Acessando Objetos


Fonte: Prprio autor

No Exemplo 8, a varivel $calc permite que o usurio acesse os


mtodos/atributos do objeto Calculadora.
2.5 Inicializando Objetos
Para que uma varivel que referencia um objeto seja utilizada, necessrio
que este objeto exista, ou seja, preciso que ele seja criado e esteja
armazenado na memria do computador. PHP dispe do comando new, que
cria um novo objeto, inicializando os atributos da classe segundo o construtor
da classe.
2.6 Construtor
Tipo especial de mtodo que inicializa as variveis do objeto, quando
instanciado (inicializado). Como mencionado anteriormente, a nossa classe
Conta possui dois atributos principais (nmero e saldo).

18

Tcnico em Informtica

Competncia 02
Exemplo 9
<?php
class Filme{
public $nome;
public $saldo;
function __construct($nome, $saldo)
{
$this->nome = $nome;
$this->saldo = $saldo;
}
function incrementarSaldo($valor)
{
$this->saldo = $this->saldo + $valor;
}
}
$filme = new Filme("Exterminador", 100);
$filme->incrementarSaldo(150);
echo "Nome do filme: $filme->nome <br>";
echo "Saldo: $filme->saldo";
?>

Sada:
Nome do filme: Exterminador
Saldo: 250

Construtores no possuem um retorno, e utilizam a instruo


__construct. Para que um construtor seja chamado necessrio o uso da
palavra chave new seguida pelo nome da classe e a lista de parmetros.
No Exemplo 9, o construtor da classe Filme chamado em $filme = new
Filme(1, 100). Isso invoca o mtodo __construct($nome,
$saldo), passando nome Exterminador e saldo 100. Os valores do
nome e saldo da varivel $filme so inicializados no cdigo do construtor
($this->nome = $nome; e $this->saldo = $saldo;).

Veja esse site que


apresenta uma
descrio mais
detalhada sobre
construtores em
PHP
http://php.net/man
ual/pt_BR/language
.oop5.decon.php

19

Orientao a Objetos

Competncia 02
2.7 O Operador $this
O operador $this do PHP indica o que a varivel/mtodo que est sendo
utilizada em determinada parte da classe pertencente ao objeto atual e
somente a ele. Por exemplo, o mtodo __construct do Exemplo 9 possui dois
parmetros (nmero e saldo - no confunda com os atributos da classe
Conta). Para que seja possvel a diferenciao entre os parmetros do mtodo
construtor e os atributos da classe Conta o operador $this se faz necessrio.
Dessa forma, quando utilizamos o $this para acessar alguma entidade da
classe (mtodo ou atributo), de fato estamos referenciando as entidades
pertencentes a este (this em ingls) objeto que est sendo usado no
momento.
Assim no trecho de cdigo a seguir, as variveis marcadas em vermelho
referem-se aos parmetros do construtor, enquanto que as variveis em azul
pertencem classe.
function __construct($nome, $saldo)
{
$this->nome = $nome;
$this->saldo = $saldo;
}

O operador til, pois:

Facilita a leitura do cdigo;


Pode ser decisivo em casos de ambiguidade.

20

Tcnico em Informtica

Competncia 02
Exemplo 10
<?php
class Conta{
public $numero;
public $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}
function creditar($valor)
{
$this->saldo = $this->saldo + $valor;
}
function debitar($valor)
{
$this->saldo = $this->saldo - $valor;
}
function transferir($outraConta, $valor)
{
if($this->saldo > $valor)
{
$this->debitar($valor);
$outraConta->creditar($valor);
}
//Se no entrou no if pq o saldo
// insuficiente.
}
}
$conta1 = new Conta(1, 100);
$conta2 = new Conta(2, 100);
echo "Saldo da conta $conta1->numero: $conta1->saldo <br>"
echo "Saldo da conta $conta2->numero: $conta2->saldo <br>";
$conta1->transferir($conta2, 50);
echo "Transferncia efetuada de 50 da conta1 para conta2 <br>";
echo "Saldo da conta $conta1->numero: $conta1->saldo <br>"
echo "Saldo da conta $conta2->numero: $conta2->saldo <br>";
?>

21

Orientao a Objetos

Competncia 02
Sada:
Saldo da conta 1: 100 Saldo da conta 2: 100
Transferncia efetuada de 50 da conta1 para conta2
Saldo da conta 1: 50
Saldo da conta 2: 150

No Exemplo 10, criamos uma classe conta que possui nmero e saldo e esta
efetua operaes de dbito, de crdito e tambm de transferncias entre
contas. Observe neste caso a importncia do operador $this no mtodo
transferir. No caso geral, quando efetuamos uma transferncia bancria,
fazemos um dbito na nossa conta corrente e efetuamos um crdito na conta
de destino. Nesse caso particular, fizemos um dbito de 50 na conta atual
($this->debitar($valor)) e efetuamos um crdito de 50 na outra
conta ($outraConta->creditar($valor)). Alm disso, para a nossa
aplicao, uma transferncia s pode ser efetuada se h saldo suficiente para
operao.
2.8 Atributos e Mtodos Estticos
Quando um atributo/mtodo pertence no somente a um objeto, como no
exemplo do nmero de uma Conta (ver Exemplo 10), mas a todos os objetos
pertencentes classe, ento utilizamos um atributo/mtodo do tipo esttico.
A declarao de um atributo ou mtodo esttico faz com que este seja
acessvel sem que haja a necessidade de criao de um objeto. importante
mencionar que um mtodo esttico pode ser acessado por um objeto, mas
um atributo no. Dado que atributos/mtodos estticos podem ser acessados
sem a necessidade de um objeto existir, a palavra-chave $this no pode ser
utilizada dentro de um mtodo esttico. Alm disso, atributos estticos no
podem ser utilizados atravs do operador (->).
O Exemplo 11 apresenta uma forma de utilizao de atributo/mtodo
esttico. Observe que nenhum objeto foi criado e, mesmo assim, foi possvel
acessar os atributos da classe. Observe que nesse caso o valor $pi no est
relacionado com nenhum objeto especfico e, por isso, foi associado classe,

22

Tcnico em Informtica

Competncia 02
diferentemente de um saldo da conta que pertence a um objeto especfico.
Exemplo 11
<?php
class AreaCalc{
public static $pi = 3.141517;
static function areaCircunferencia($raio)
{
return $raio*$raio*(AreaCalc::$pi);
}
}
$raioAtual = 10;
$area = AreaCalc::areaCircunferencia($raioAtual);
$valorPi = AreaCalc::$pi;
echo "Area circunferencia de raio $raioAtual eh $area<br>";
echo "Valor de pi $valorPi<br>";
?>

Sada:
Area circunferncia de raio 10 eh 314.1517
Valor de pi 3.141517

Links teis
www.devmedia.co
m.br/introducao-aorientacao-aobjetos-emphp/26762
www.kadunew.com
/blog/php/introduc
ao-php-orientadoa-objetos-objetose-classes

23

Orientao a Objetos

Competncia 03
3.COMPETNCIA
03
|
CONCEITOS
DE
ASSOCIAO,
ENCAPSULAMENTO, ABSTRAO, POLIMORFISMO E INTERFACE
Nesta seo vamos apresentar as principais tcnicas de reuso de software do
paradigma orientado a objetos.
3.1 Herana
A reduo de custos com software no est em contratar programadores
baratos e mal qualificados. Isso pode prejudicar bastante o tempo de entrega
do projeto e sua usabilidade, alm de dificultar a manuteno do cdigo.
A reduo dos custos de um determinado software se d atravs do reuso e
adaptabilidade do cdigo. De fato, um dos custos mais efetivos do processo
de desenvolvimento de software est relacionado ao capital humano. Para
isso, entre outros aspectos, necessrio dispor de uma linguagem que d
suporte a fatores de qualidade como facilidade de reuso e manuteno,
incluindo adaptabilidade.
Uma das formas de reuso de software a herana. Relaes como ObjetoA
um tipo de ObjetoB so claros indicativos de que a herana pode ser utilizada.
Ex: Poupana (Objeto A) um tipo de Conta (Objeto B). Ou seja, o ObjetoA
tem tudo que ObjetoB tem, incluindo algumas funcionalidades extras.
Quando uma classe herda da outra temos uma relao de dependncia entre
as duas, na qual existe uma superclasse (classe que herdada) e uma
subclasse (classe que herda). Com esse recurso possvel aproveitar uma
estrutura existente de uma classe e replicar em outra. Dessa forma,
conseguimos reutilizar cdigos, sem a necessidade de reescrever ou duplicar
trechos do programa. Os relacionamentos entre as subclasses e a superclasses
em PHP so:
1. A subclasse herda o comportamento (atributos e mtodos), diretamente

24

Tcnico em Informtica

Competncia 03
de apenas uma superclasse;
2. Funciona como uma hierarquia.

Figura 2 - Hierarquia de classes


Fonte: Prprio autor

No exemplo acima (Figura 2) Cachorro herda diretamente de Mamfero,


mas tambm herda indiretamente de animal, haja vista que a herana
transitiva.
Usa a palavra reservada extends exemplo: class Poupanca
extends Conta{}
O Exemplo 12 estende o Exemplo 10 e mostra como seria criada uma classe
Poupana que herda da classe Conta. Como se sabe, uma poupana bancria
um tipo especial de conta que possui uma taxa de juros que aplicada ao
saldo em perodos determinados.
Neste exemplo, veremos como simples herdar o comportamento da classe
Conta na classe Poupanca. Observe que na classe poupana, apenas as
funcionalidades adicionais so codificadas e todo o restante das
funcionalidades da classe Conta so aplicadas implicitamente ao cdigo da
classe Poupanca. Os mtodos creditar e debitar so adicionados
implicitamente na classe poupana. Portanto, pode ser chamada diretamente
sem maiores problemas.

25

Orientao a Objetos

Competncia 03
Exemplo 12
<?php
class Conta{
public $numero;
public $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}
function creditar($valor)
{
$this->saldo = $this->saldo + $valor;
}
function debitar($valor)
{
$this->saldo = $this->saldo - $valor;
}
function transferir($outraConta, $valor)
{
if($this->saldo > $valor)
{
$this->debitar($valor);
$outraConta->creditar($valor);
}
}
}
class Poupanca extends Conta{
public $juros = 0.05;
function atualizarJuros()
{
$this->saldo = $this->saldo*(1 + $this->juros);
}
}
$conta = new Conta(1, 150);
$poupanca = new Poupanca(2, 150);
$conta->creditar(50);
$conta->debitar(100);

26

Tcnico em Informtica

Competncia 03
//os mtodos debitar e creditar so utilizados sem problemas
//mesmo que no sejam escritos explicitamente.
$poupanca->creditar(50);
$poupanca->debitar(100);
$poupanca->atualizarJuros();
echo "Saldo da conta $conta->numero: $conta->saldo <br>";
echo "Saldo da conta $poupanca->numero: $poupanca->saldo <br>";
?>

Sada do programa:
Saldo da conta 1: 100
Saldo da conta 2: 105

Podemos observar que no caso da conta poupana, o valor do saldo foi


atualizado com juros (que nesse caso fixo em 5%). A superclasse Conta tem
como subclasse Poupanca.
Se ao invs de adicionarmos um valor fixo para a taxa de juros, quisssemos
inicializar o valor da taxa com um valor dado pelo usurio? Utilizaramos um
construtor como no Exemplo 13. O construtor inicializa o nmero, saldo e
juros com um valor definido pelo usurio.
Exemplo 13
<?php
class Conta{
public $numero;
public $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}

27

Orientao a Objetos

Competncia 03
function creditar($valor)
{
$this->saldo = $this->saldo + $valor;
}
function debitar($valor)
{
$this->saldo = $this->saldo - $valor;
}
function transferir($outraConta, $valor) {
if($this->saldo > $valor)
{
$this->debitar($valor);
$outraConta->creditar($valor);
}
}
}
class Poupanca extends Conta{
public $juros;
function __construct($numero, $saldo, $juros)
{
$this->numero = $numero;
$this->saldo = $saldo;
$this->juros = $juros;
}
function atualizarJuros()
{
$this->saldo = $this->saldo*(1 + $this->juros);
}
}
$conta = new Conta(1, 150);
$poupanca = new Poupanca(2, 150, 0.10);
$conta->creditar(50);
$conta->debitar(100);
$poupanca->creditar(50);
$poupanca->debitar(100);
$poupanca->atualizarJuros();
echo "Saldo da conta $conta->numero: $conta->saldo <br>";
echo "Saldo da conta $poupanca->numero: $poupanca->saldo <br>";
?>

28

Tcnico em Informtica

Competncia 03
Sada do programa:
Saldo da conta 1: 100
Saldo da conta 2: 110

Apesar de estar sintaticamente correta, a forma de inicializar os atributos da


classe Conta no construtor de Poupanca no est sendo feita da maneira mais
adequada. Estamos reescrevendo o cdigo do construtor de Conta no
construtor da classe Poupanca. Poderamos, ao invs disso, reutilizar o
construtor de poupana fazendo uma chamada do construtor da classe pai
utilizando o operador (parent::). Com o uso deste operador podemos
acessar qualquer mtodo da classe pai (at mesmo o construtor). No Exemplo
14, mostramos como o mesmo cdigo seria executado de uma forma mais
elegante pela utilizao do operador (parent::).
Exemplo 14
<?php
class Conta{
public $numero;
public $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}
function creditar($valor)
{
$this->saldo = $this->saldo + $valor;
}
function debitar($valor)
{
$this->saldo = $this->saldo - $valor;
}
function transferir($outraConta, $valor){
if($this->saldo > $valor)
{
$this->debitar($valor);
$outraConta->creditar($valor);

29

Orientao a Objetos

Competncia 03
}
}
}
class Poupanca extends Conta{
public $juros;
function __construct($numero, $saldo, $juros)
{
parent::__construct($numero, $saldo);
$this->juros = $juros;
}
function atualizarJuros()
{
$this->saldo = $this->saldo*(1 + $this->juros);
}
}
$conta = new Conta(1, 150);
$poupanca = new Poupanca(2, 150, 0.10);
$conta->creditar(50);
$conta->debitar(100);
$poupanca->creditar(50);
$poupanca->debitar(100);
$poupanca->atualizarJuros();

echo "Saldo da conta $conta->numero: $conta->saldo <br>";


echo "Saldo da conta $poupanca->numero: $poupanca->saldo <br>";
?>

A sada do Exemplo 14 idntica do Exemplo 13. Porm, a segunda forma


de se escrever o cdigo mais eficiente dado que, caso haja uma alterao no
cdigo do construtor da classe Conta, a alterao seria feita apenas na classe
Conta.
possvel tambm alterar o comportamento de uma determinada classe
reutilizando o cdigo da superclasse. Por exemplo, se no caso da poupana
todo crdito fosse seguido de uma atualizao de juros. Nesse caso, teramos

30

Tcnico em Informtica

Competncia 03
uma classe Poupanca como mostrada no Exemplo 15 (insira a classe Poupanca
do Exemplo 14 e veja voc mesmo a diferena no resultado).
Exemplo 15
class Poupanca extends Conta{
public $juros;
function __construct($numero, $saldo, $juros)
{
parent::__construct($numero, $saldo);
$this->juros = $juros;
}
function creditar($valor)
{
parent::creditar($valor);
$this->atualizarJuros();
}
function atualizarJuros()
{
$this->saldo = $this->saldo*(1 + $this->juros);
}
}

Sada do programa:
Saldo da conta 1: 100
Saldo da conta 2: 132

Nesse caso, fizemos uma sobrecarga do mtodo creditar. Onde o mtodo da


superclasse (Conta) foi alterado para um comportamento diferente na
subclasse (Poupana). importante salientar que a chamada do mtodo da
superclasse com o operador parent:: no obrigatrio e o mtodo
sobrescrito pode ser totalmente diferente do da classe pai.
3.2 Modificadores de Acesso
A fim de garantir que algumas variveis, atributos e at mesmo classes s
sejam visveis nos locais necessrios, PHP dispe de modificadores de acesso

31

Orientao a Objetos

Competncia 03
que indicam a visibilidade de cada atributo, mtodo ou at mesmo da prpria
classe. Essa funcionalidade importante para garantir que somente o
necessrio seja visvel fora da classe. Isso garante que a classe PHP seja
visualizada como um mdulo isolado e apenas o que interessa seja visvel a
outras partes do cdigo.
Os modificadores de acesso da linguagem PHP so:
Private, visvel apenas dentro da classe.
Protected, visvel dentro da classe e em todas as classes que herdam desta
classe.
Public, visvel em todos os lugares do sistema. Quando no se especifica
nenhuma opo, ento o atributo/mtodo assumido como public.
Os exemplos a seguir auxiliaro o entendimento das variveis public,
protected e private.
Exemplo 16
<?php
class Visibilidade{
public $varPublic;
protected $varProtected;
private $varPrivate;
public function __construct($va1, $var2, $var3)
{
$this->varPublic = $va1;
$this->varProtected = $var2;
$this->varPrivate = $var3;
}
}
$visibilityTest = new Visibilidade(1,2,3);
echo "Atributo Public : $visibilityTest->varPublic";
//echo "Atributo Protected : $visibilityTest->varProtected";
//echo "Atributo Public : $visibilityTest->varPrivate";
//As duas lihas acima no funcionariam pois as variveis no
//so visveis
?>

Sada:

32

Tcnico em Informtica

Competncia 03
Atributo Public : 1

No Exemplo 16 observa-se que apenas a varivel $varPublic visvel,


portanto apenas esta pode ser acessada de fora da classe. O mesmo vale para
o Exemplo 17 onde apenas o mtodo pblico pode ser invocado de fora da
classe.
Exemplo 17
<?php
class Visibilidade{
public function publicFunction()
{
echo "public method<br>";
}
protected function protectedFunction()
{
echo "protected method<br>";
}
private function privateFunction()
{
echo "private method<br>";
}
}
$visibilityTest = new Visibilidade();
$visibilityTest->publicFunction();
//$visibilityTest-> protectedFunction();
//$visibilityTest-> privateFunction();
//As duas lihas acima no funcionam pois as variveis no
//so visveis
?>

No Exemplo 18, modificamos o Exemplo 15 e vemos um exemplo de um


atributo protected ($juros) que utilizado pela subclasse de forma direta. Se
este atributo fosse private, haveria um erro e a sada no seria gerada.

33

Orientao a Objetos

Competncia 03
Exemplo 18
class Poupanca extends Conta{
protected $juros;
Os links abaixo
apresentam
informaes
adicionais a
respeito dos
conceitos de
orientao a
objetos em PHP e
herana.
http://php.net/man
ual/pt_BR/language
.oop5.basic.php
http://josemalcher.
net/heranca-php/
http://php.net/man
ual/pt_BR/language
.oop5.inheritance.p
hp

function __construct($numero, $saldo, $juros)


{
parent::__construct($numero, $saldo);
$this->juros = $juros;
}
function creditar($valor)
{
parent::creditar($valor);
$this->atualizarJuros();
}
function atualizarJuros()
{
$this->saldo = $this->saldo*(1 + $this->juros);
}
}

3.3 Mtodos Get e Set


Para um melhor controle das variveis dos objetos, recomendado que elas
sejam declaradas como private. Com esse procedimento, garantido que
nenhuma outra parte do programa faa uso indevido das variveis. O que
voc acha se uma varivel como saldo bancrio, por exemplo, fosse declarada
com public? Qualquer outro cdigo do programa poderia atribuir qualquer
valor para a varivel saldo, isto seria um desastre no ?
Para controlar o acesso das variveis como boa prtica de programao so
declarados nas classes os mtodos get e set, que so mtodos que
retornam o valor da varivel e atribuem um novo valor a ela,
respectivamente.
Dessa forma, o programador define quem pode acessar as variveis e quais
so as condies para que uma varivel seja alterada ou lida. O Exemplo 19

34

Tcnico em Informtica

Competncia 03
mostra como o saldo de uma conta de banco poderia ser lido mesmo que a
varivel saldo seja private (usaremos mtodos get e set). Observe que no
Exemplo 14, por outro lado, o saldo da conta pode ser manipulado sem
problemas em qualquer parte do programa.
Exemplo 19
<?php
class Conta{
private $numero;
private $saldo;
function __construct($numero, $saldo)
{
$this->numero = $numero;
$this->saldo = $saldo;
}
public function getSaldo()
{
//Aqui poderia conter um codigo de verificacao
//de autencidade do usuario
return $this->saldo;
}

public function setSaldo($novoSaldo)


{
//Aqui poderia conter um codigo de verificacao
//do valor depositado
$this->saldo = $novoSaldo;
}
}
$conta = new Conta(1, 100);
//$conta->saldo = 300; A varivel no e visvel - ERRO
$conta->setSaldo(300);
//echo "Saldo: $conta->saldo"; A varivel no e visvel - ERRO
$saldoAtual = $conta->getSaldo();
echo "Saldo: $saldoAtual";
?>

35

Orientao a Objetos

Competncia 03
3.4 Classes Abstratas
Um dos maiores benefcios do conceito de orientao a objetos o uso de
tipos abstratos. Uma abstrao de uma classe um nome elegante para um
agregado de dados e informaes bem encapsulados. Muitas vezes voc no
est interessado em como as operaes so realizadas, mas sim no
comportamento desse agrupamento de dados. Em PHP as abstraes de
dados so implantadas com classes abstratas e interfaces.
Vejamos um exemplo de abstrao de dados: suponha que queiramos
representar uma classe comida. Sabe-se que a comida no pode ser
imaginada sem que um dos seus representantes seja pensado. Ou seja, s
existe uma comida se houver um tipo de comida especfica (ex. Arroz, Feijo).
O que seria um objeto Comida? Comida representa um conceito abstrato
daquilo que se pode comer.
Em PHP, quando h algum comportamento (mtodo) em alguma classe que
no podemos representar a menos que uma classe que a herde implante,
temos uma grande candidata classe abstrata. Fica a cargo das suas
subclasses o trabalho de redefinir o mtodo dito abstrato.
Por exemplo, suponha que precisssemos de uma classe do tipo figura
geomtrica para calcularmos sua rea e permetro. Nesse caso, para
calcularmos a rea temos que especificar que tipo de figura geomtrica
temos. Portanto, a classe FiguraGeometrica seria uma classe abstrata. Como
subclasses desta temos, para esse exemplo, Quadrado e Circunferencia. A
Figura 3 detalha a estrutura de classes.

36

Tcnico em Informtica

Competncia 03

Figura 3 - Esquema de classes para Figura Geomtrica.


Fonte: Prprio autor

Observe que no caso do Quadrado e Circunferencia pode-se calcular sua rea


e permetro. O Exemplo 20 apresenta o cdigo referente s trs classes
mostradas a seguir.
Exemplo 20
<?php
abstract class FiguraGeometrica{
private $tipo;
public function __construct($tipo)
{
$this->tipo = $tipo;
}
public function printCaracteristicas()
{
$areaTemp = $this->area();
$perimetroTemp = $this->perimetro();
echo "Tipo: $this->tipo, Area $areaTemp, Perimetro
$perimetroTemp<br>";
}
public abstract function area();
public abstract function perimetro();
}
class Circunferencia extends FiguraGeometrica{
private $raio;
public function __construct($tipo, $raio)
{
parent::__construct($tipo);
$this->raio = $raio;

37

Orientao a Objetos

Competncia 03
}
public function area()
{
return 3.14*$this->raio*$this->raio;
}
public function perimetro()
{
return 2*3.14*$this->raio;
}
}
class Retangulo extends FiguraGeometrica{
private $lado1, $lado2;
public function __construct($tipo, $lado1, $lado2)
{
parent::__construct($tipo);
$this->lado1 = $lado1;
$this->lado2 = $lado2;
}
public function area()
{
return $this->lado1*$this->lado2;
}
public function perimetro()
{
return 2*$this->lado1 + 2*$this->lado2;
}
}
$circ = new Circunferencia("Circunferencia", 10);
$circ->printCaracteristicas();

$retangulo = new Retangulo("Retangulo", 10, 20);


$retangulo->printCaracteristicas();
?>

Sada:
Tipo:
Circunferencia,
Area
314,
Tipo: Retangulo, Area 200, Perimetro 60

Perimetro

62.8

Para definir a classe


como abstrata
utilizamos a palavra
chave abstract
antes da definio
da classe. O mesmo
vale para os
mtodos abstratos.
Observe tambm
que o mtodo
possui apenas
assinatura e no
possui corpo. Como
ambas as classes
Circunferencia e
Retangulo herdam
de
FiguraGeometrica,
o mtodo
printCaracteristicas
pode ser chamado
sem problemas
atravs de suas
classes filhas.

38

Tcnico em Informtica

Competncia 03
3.5 Interfaces
E se ao invs de abstrair parte da implantao, como fazemos com classes
abstratas, quisssemos abstrair toda a implantao de todos os mtodos da
classe? Ou seja, se no estivssemos interessados nas implantaes das
classes, mas sim nos servios que a classe pode oferecer, usaramos interfaces
que so espcies de contratos entre duas classes. Uma oferece servios
outra. Como, por exemplo, repositrios onde s estamos interessados em
inserir, remover e atualizar. No estamos interessados se o repositrio feito
com arrays, banco de dados, vetores, ou qualquer que seja a estrutura de
dados na qual os objetos so armazenados. As interfaces podem ser pensadas
relativamente como uma classe abstrata s com mtodos abstratos.
Exemplo de Interface:
interface
public
public
public
}

IRepositorioContas{
function cadastrar($conta);
function remover($conta);
function atualizar($conta);

Todos os repositrios que implantam os servios definidos em


IRepositrioContas devem conter os mtodos definidos na interface acima.

www.youtube.com/w
atch?v=S4DC7uRNrQE

Por exemplo, uma classe Agencia poderia implantar esta interface em


particular. Precisamos informar que a classe implanta a interface em questo,
usando a palavra chave implements como descrito abaixo.
public Agencia implements IRepositorioContas {
public function cadastrar($conta)
{
//Corpo da classe
}
public function remover($conta)
{
//Corpo da classe
}

Implemente em PHP a
classe Funcionario,
que tem como
atributos o nmero de
dias trabalhados,
valor do ganho dirio
e seu respectivo
nome. Adicione
classe Funcionario um
mtodo que calcula o
seu salrio com base
no ganho dirio e nos
dias trabalhados.

39

Orientao a Objetos

Competncia 03
public function atualizar($conta)
{
//Corpo da classe
}
}

Assim como objetos que herdam de alguma classe podem ser referenciados
pela superclasse, um objeto que referencia uma interface pode ser
referenciado por uma varivel com o tipo da Interface em questo. Por
exemplo:
$contas1 = new Agencia();
$contas2 = new ObjetoQueImplementaIRepositorioContas();
$contas2->inserir(new Conta());
$contas1->inserir(new Conta());
//posso chamar sem medo os mtodos de IRepositorioContas.

Pense na
implementao da
classe gerente, que
um tipo especial de
funcionrio, pois tem
os mesmos atributos
de um funcionrio,
mas seu salrio
calculado de forma
diferente, seu salrio
fixado em 1000.00
reais. Tente
implementar esta
classe reusando o
cdigo da classe
Funcionario.

Digamos que
devemos calcular a
mdia entre dois
nmeros e no
estamos interessados
em como esta mdia
calculada. Defina
trs classes
Mediageometrica,
MediaAritmetica e
MediaHarmonica cada
um com um mtodo
CalcularMedia.
Escreva uma tela de
Teste com um
mtodo para testar os
trs mtodos usando
a mesma referencia a
um Tipo Media. Faa a
questo usando
interface e depois use
Classe abstrata.

40

Tcnico em Informtica

Competncia 04
4.COMPETNCIA 04| UTILIZANDO TCNICAS DE ORIENTAO A
OBJETOS EM UMA APLICAO
O projeto utilizado por esta disciplina uma continuao do projeto
Popcorntv que vocs j conhecem. Vamos neste caderno reaproveitar o
projeto da disciplina de Desenvolvimento para Web e modificar o cdigo para
que siga o padro orientado a objetos. Consideramos que voc conhea os
pr-requisitos necessrios para elaborao do projeto, ou seja, voc j sabe
utilizar o XAMPP, Aptana Studio, MySQL. Vamos fazer um cadastro completo
de filmes para a locadora virtual utilizando classes e objetos ao invs de
puramente PHP estruturado. A Figura 4 apresenta a tela principal do
programa.

Figura 4 Popcorn TV Projeto da disciplina.


Fonte: Prprio autor.

Utilize o projeto base que est localizado no AVA e importe para o Aptana. Se
voc estiver com dvidas de como fazer isso, veja a Seo 5 do caderno de
Desenvolvimento para Web que l voc encontrar as informaes

41

Orientao a Objetos

Competncia 04
necessrias para importar o projeto.
4.1 Conectando ao MySQL
Assumimos que voc j possua uma base de dados chamada popcorntv
previamente configurada utilizando o XAMPP. Essa base de dados a mesma
que foi utilizada no projeto da disciplina de Desenvolvimento para Web. Para
o caso orientado a objetos, ao invs de utilizar comandos estruturados para
conectar ao banco de dados, vamos criar uma classe que faa conexo com o
banco de dados. Todos os comandos de envio de consultas SQL sero por esta
classe. A classe apresentada na Figura 5. Crie um novo arquivo chamado
conexao.php e digite o cdigo abaixo. Nos comentrios do cdigo esto as
explicaes de cada funo e varivel. Observe que foram criados mtodos
para conectar ao banco, executar consultas e todas as variveis relativas ao
banco ficam encapsuladas no objeto conexo quando este for criado.
Depois de criada a classe, basta que o programador crie um novo objeto
conexo, conecte ao banco e execute as consultas desejadas. Por exemplo:
//Cria o objeto conexo que ser responsvel pelas chamadas ao banco de
dados $conexao = new Conexao("localhost", "root", "", "popcorntv");
//Conecta ao banco de dados
if($conexao->conectar() == false)
{
//Caso ocorra algum erro, uma mensagem mostrada ao
usurio
echo "Erro" . mysqli_error();
}
$sql = "DELETE FROM filme WHERE codigo = '2'";
//Executa a consulta
$conexao->executarQuery($sql);

Voc deve ter o


cuidado de saber o
endereo de seu
banco, a senha, o
login e o nome do
banco. Caso algum
deles esteja errado,
ir aparecer uma
mensagem de erro
informando.
Verifique tambm
se o XAMPP est
ligado com o
Apache e o MySQL
(ver caderno de
desenvolvimento
para web).

42

Tcnico em Informtica

Competncia 04

43

Orientao a Objetos

Competncia 04

No link abaixo voc


ver um artigo
completo sobre
conexo com banco
de dados MySQL,
utilizando PHP
orientado a objetos.
Leia o texto e se
concentre nos
aspectos tericos
do artigo dado
porque utilizamos
uma forma
diferente de
escrever o cdigo.
www.escolacriativid
ade.com/phporientado-aobjetos-conexao-abanco-de-dados/

Figura 5 - Classe Conexo.


Fonte: Prprio autor.

44

Tcnico em Informtica

Competncia 04
4.2 Classe Bsica Filme
A classe bsica filme serve para encapsularmos os dados dos filmes de nossa
loja. Os dados da classe filme so: ttulo, cdigo, sinopse, quantidade e trailer.
Para cada atributo da classe sero criados mtodos get e set e o resultado
voc pode conferir na Figura 6. Observe que no sero explicados novamente
esses conceitos neste ponto do texto, pois j foram apresentados na seo de
orientao a objetos.

45

Orientao a Objetos

Competncia 04

Figura 6 - Classe Filme.


Fonte: Prprio autor.

4.3 Repositrio de Dados


Para acesso dos dados do banco vamos utilizar uma classe para manipulao
dos mesmos. Assim, sempre que quisermos ler ou alterar um elemento do
banco de dados, vamos acessar essa classe que, em seguida, utilizar a classe
Conexao. Essa classe chamada de repositrio e funciona como uma ponte
entre a aplicao e o local onde os dados so guardados. A Figura 7 apresenta
sua relao com o restante da aplicao.

46

Tcnico em Informtica

Competncia 04

Figura 7 - Esquema de acesso aos dados do Sistema.


Fonte: Prprio autor.

A partir da utilizao do repositrio, a aplicao no necessita executar


comandos SQL diretamente. Portanto, h uma separao entre o cdigo da
aplicao e o controle da persistncia dos dados. O cdigo do repositrio
mostrado na Figura 8 e j contm mtodos para inserir, alterar e deletar
filmes da nossa locadora virtual. Alm disso, foi criada uma interface para que
outros tipos de repositrios possam ser criados, alm do repositrio que
utiliza MySQL. Caso outra forma de guardar os dados da aplicao fosse
necessria (arquivos, por exemplo), no precisaramos alterar nada acima do
repositrio (Figura 7). Apenas o repositrio seria alterado. Crie no seu projeto
um arquivo repositorio_filmes.php e adicione o cdigo abaixo. Ele est todo
comentado e no ser difcil entender os seus conceitos, dado que voc
chegou at aqui.

47

Orientao a Objetos

Competncia 04

48

Tcnico em Informtica

Competncia 04

49

Orientao a Objetos

Competncia 04

O repositrio de
dados um padro
de projeto muito
utilizado em
orientao a
objetos. Veja mais
conceitos
relacionados a este
tema em:
http://sergiotabord
a.wordpress.com/d
esenvolvimento-desoftware/java/patte
rns/repository/

Figura 8 - Classe de repositrio dos dados.


Fonte: Prprio autor.

4.4 Listando Dados


Vamos agora listar os dados da tabela filmes e apresent-la na tela. Caso voc
no se lembre, olhe no caderno de Desenvolvimento Web como essa
atividade realizada utilizando cdigo estruturado. Vamos fazer essa mesma
listagem utilizando cdigo orientado a objetos. Para isso, vamos alterar a
pgina index.php e fazer duas alteraes. A primeira diz respeito ao incio da
pgina que ir criar o repositrio para obter a lista de todos os filmes
cadastrados no banco. O trecho de cdigo mostrado a seguir:

50

Tcnico em Informtica

Competncia 04
<?php
//Cria um objeto repositrio e inclui as classes bsicas
require 'repositorio_filmes.php';
//Obtem a lista de todos os filmes cadastrados
$filmes = $repositorio->getListaFilmes();
?>

A outra mudana (cdigo logo abaixo) trata-se de uma alterao referente


tabela de filmes mostrada na pgina html. Enquanto o projeto base possui
uma lista de filmes fixos, ns vamos fazer com que essa tabela possua dados
trazidos do banco. Observe que existe um loop (while) que varre todos os
elementos do array de filmes do banco. Para cada elemento do array, um
boto alterar, para o nome do filme, e um boto excluir so inseridos. O
cdigo final mostrado na Figura 9.
while($filmeTemporario = array_shift($filmes))
{
?>
<tr>
<td class="col-md-1">
<a class="btn btn-default" href="#"
role="button">Alterar</a>
</td>

Observe que o
nome do filme
obtido por meio do
mtodo getTitulo(),
pois o atributo
titulo da classe
Filme privado.
Alm disso, por
hora, os botes
alterar e excluir
esto sem
funcionalidade
implementada.

<td class="col-md-6"> <?php echo $filmeTemporario->getTitulo()


?> </td>
<td class="col-md-1">
<a class="btn btn-danger" href="#"
role="button">Excluir</a>
</td>
</tr>
<?php
}
?>

Fique atento!
Algumas partes do
cdigo no foram
copiadas (observe o
nmero das linhas).
Copie o cdigo para
o seu projeto com
cuidado. O local
onde o cdigo foi
alterado est
marcado.

51

Orientao a Objetos

Competncia 04

Figura 9- Cdigo de index.html para listar os dados do banco.


Fonte: prprio autor.

52

Tcnico em Informtica

Competncia 04
O resultado pode ser visto na Figura 10.

Faa os mesmos
passos que fizemos
para Filmes com
uma Classe
funcionrio. Utilize
a mesma estrutura
de funcionrios
utilizada no
caderno de
Desenvolvimento
Web.

Figura 10 - Listagem de Filmes.


Fonte: Prprio autor.

4.5 Incluindo Novos Filmes


Agora que podemos ver os dados no banco vamos adicionar dados. O
processo muito parecido, mas antes teremos que receber dados do usurio.
Precisaremos de um formulrio que receber os valores fornecidos pelo
usurio.
O modelo j contm um formulrio em HTML que vamos modific-lo para
nossas necessidades. Ele vai servir tanto para incluir como para alterar os
dados. O formulrio em HTML ir enviar os dados pelo mtodo post para a
pgina inserir_filme.php que faremos mais a frente, ser nele que
conectaremos com o banco. Por agora voc deve terminar a tag <form>
incluindo os parmetros action e post. A Figura 11 apresenta o cdigo que
envia os dados de insero.

53

Orientao a Objetos

Competncia 04

Figura 11 - Alteraes no formulrio para incluir um novo filme.


Fonte: Caderno de Desenvolvimento para Web EAD-PE.

Alm do cdigo de insero do filme, necessrio que se crie uma pgina php
que receba os dados do formulrio e envie para o repositrio. Essa classe
mostrada na Figura 12.

Implemente a
funcionalidade de
incluir funcionrio.
Utilize a mesma
ideia de incluir
filmes.

Figura 12 - Cdigo de incluir_filme.php.


Fonte: Prprio autor.

4.6 Removendo Filmes


Para que possamos remover um filme, necessrio do cdigo do filme. Assim,
para cada entrada da tabela de filmes em index.php vamos inserir um
hiperlink com o cdigo do filme apresentado para a pgina excluir_filme.php.
Caso voc no se lembre de como isso feito, observe o caderno de

54

Tcnico em Informtica

Competncia 04
Desenvolvimento Web. A Figura 13 apresenta a alterao em questo.

Figura 13 - Envio de cdigo do filme para excluso no banco de dados.


Fonte: Prprio autor.

O cdigo da pgina excluir_filme mostrado a seguir (Figura 14). Observe que


apenas o cdigo do filme foi necessrio para que o repositrio delete a
entrada.

Implemente a
funcionalidade de
remover funcionrio.
Utilize a mesma ideia
de remover filmes.

Figura 14 - Cdigo fonte de excluir_filme.php.


Fonte: Prprio autor.

4.7 Alterando Filmes


Para a alterao de filmes iremos utilizar a mesma abordagem utilizada no
caderno de Desenvolvimento Web para alterao de dados. Vamos utilizar
uma varivel $destino que indicar se o formulrio vai enviar os dados
para a pgina incluir_filme.php ou alterar_filme.php (veja a seguir). As
respectivas fontes so mostradas nas Figuras 15 e 16. Na Figura 16 temos o

Releia atentamente
o caderno de
Desenvolmento Web
para ver como a
estratgia de
alterao de dados.
O que vai mudar no
cdigo so as formas
como os campos do
formulrio so
preenchidos. No
caso orientado a
objeto, utilizamos
um objeto para
mostrar seus
respectivos
atributos.

55

Orientao a Objetos

Competncia 04
arquivo contendo todas as funcionalidades anteriores (exemplo: remover,
inserir).

Figura 15 - Cdigo de alterar filme.


Fonte prprio autor.

56

Tcnico em Informtica

Competncia 04

57

Orientao a Objetos

Competncia 04

Implemente a
funcionalidade de
alterar funcionrio.
Utilize a mesma
ideia de alterar
filmes.

Figura 16 - Cdigo fonte index.php.


Fonte: Prprio autor.

58

Tcnico em Informtica

CONCLUSO
Este caderno apresenta um guia introdutrio sobre orientao objetos
utilizando como base a linguagem PHP. Apesar deste caderno ser focado na
linguagem PHP, os conceitos apresentados aqui so genricos o suficiente
para serem utilizados em outras linguagens que utilizam o mesmo paradigma.
Foram discutidos conceitos como: classes, atributos, mtodos, herana,
interfaces entre outros. Alm disso, no final do caderno apresentada uma
aplicao prtica multidisciplinar com os conceitos aprendidos em vrias
disciplinas como por exemplo banco de dados.

59

Orientao a Objetos

REFERNCIAS
Dalloglio, Pablo, PHP Programando com Orientao a Objetos, Ed. Novatec.
2 Ed., 2009.
Anthony Sintes, Anthony, Aprenda programao orientada a objetos em 21
dias, Ed. Pearson, 2002.
Mendes, Douglas Rocha, Programao Java - Com nfase Em Orientao a
Objetos, Ed. Novatec, 2009.
Xavier, Fabrcio S. V., Php - do Bsico Orientao de Objetos, Ed. Cincia
Moderna, 2008.
Arajo, Everton Coimbra, Orientao a Objetos Com Java, Ed. Visual Books,
2008.
Curso online PHP orientado a objetos, Por Hugo vasconcelos link:
www.youtube.com/watch?v=rAkJOH5Gz7U

60

Tcnico em Informtica

MINICURRCULO DO PROFESSOR

Bruno Silva formado em Engenharia da Computao pela UFPE, com


mestrado em Cincia da Computao pela UFPE e doutorando pela UFPE e a
universidade Technische universitat ilmenau. Atualmente professor da
Universidade Federal Rural de Pernambuco. Participa de projetos de
cooperao cientfica entre Brasil e Empresas internacionais como EMC, HP e
Foxconn.

61

Orientao a Objetos