Sie sind auf Seite 1von 67

Tcnico em Informtica

Orientao a Objetos

Bruno Silva

2015
Presidenta da Repblica Governador do Estado de Pernambuco
Dilma Vana Rousseff Paulo Henrique Saraiva Cmara

Vice-presidente da Repblica Vice-governador


Michel Temer Raul Jean Louis Henry Jnior

Ministro da Educao Secretrio de Educao


Cid Ferreira Gomes Frederico da Costa Amancio

Secretrio de Educao Profissional e Secretrio Executivo de Educao Profissional


Tecnolgica Paulo Fernando de Vasconcelos Dutra
Alssio Trindade de Barros
Gerente Geral de Educao Profissional
Diretor de Integrao das Redes Josefa Rita de Cssia Lima Serafim
Marcelo Machado Feres
Coordenador de Educao a Distncia
Coordenao Geral de Fortalecimento George Bento Catunda
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.

3
Orientao a Objetos
Competncia 01

1.COMPETNCIA 01 | PRINCPIOS E IMPORTNCIA DA


ORIENTAO A OBJETOS

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

4
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.

5
Orientao a Objetos
Competncia 01

Essa abordagem de programao tambm conhecida como abordagem top-


down (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

6
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 deve-


se:

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


Para conhecer um
Suponha que voc queira criar um sistema que calcule o valor dos descontos pouco mais sobre o
histrico das
mensais de um funcionrio de uma locadora de filmes. Por simplicidade, ser linguages
orientadas a
assumido que o trabalhador ir pagar o Imposto de Renda calculado como objetos acesse:
27,5% do salrio bruto mais a contribuio da Previdncia Social, que varia de http://pt.wikibooks.
org/wiki/Programa
trabalhador pra trabalhador. Sero exibidas vrias formas de se calcular os %C3%A7%C3%A3o_
descontos no salrio deste funcionrio. Orientada_a_Objet
os/Introdu%C3%A7
%C3%A3o e
http://social.stoa.us
p.br/poo2013pos/a
ulas/aula-2-historia-
da-programacao-
orientada-a-objetos

7
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.

8
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.

9
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; Nos links a seguir o
public $tipoFuncionario; aluno poder
visulalizar outras
function __construct($nome, $salario, $previdencia) { explicaes que
$this->nome = $nome; mostram a
$this->salario = $salario; diferena entre o
$this->previdencia = $previdencia; paradigma
$this->descontos = $this->calcularDescontos(); estruturado e
orientado a objetos.
http://fabrica.ms.se
if($this->salario >= 1000 && $this->salario < 2000) {
nac.br/2013/04/pro
$this->tipoFuncionario = "Jnior";
gramacao-
}
estruturada-versus-
else if($this->salario >= 2000 && $this->salario < 3000) { programacao-
$this->tipoFuncionario = "Pleno"; orientada-a-
} objetos/
else if($this->salario >= 3000) { www.devmedia.co
$this->tipoFuncionario = "Snior"; m.br/programacao-
} orientada-a-
} objetos-x-
function calcularDescontos(){ programacao-
return round($this->salario*0.275 + $this->previdencia,2); estruturada/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);
Videos
for($i = 0; $i < count($funcionarios); $i++) demonstrativo
{ sobre diferena
$func = $funcionarios[$i]; entre programao
echo "O valor do desconto de $func->nome $func->descontos estrutura e
e seu tipo $func->tipoFuncionario<br>"; 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"; Para conhecer um
?> pouco mais sobre
classes e objetos
em PHP acesse.
http://php.net/man
Sada: ual/pt_BR/language
SOMA : 4 .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 Veja tambm esse
vdeos:
seus atributos. A Figura 1 apresenta uma representao grfica de como uma www.youtube.com/
varivel que aponta para um objeto (referncia) esquematizada na memria watch?v=9bQNsfYq
Vc4
do computador. 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 Veja esse site que
apresenta uma
Filme(1, 100). Isso invoca o mtodo __construct($nome, descrio mais
$saldo), passando nome Exterminador e saldo 100. Os valores do detalhada sobre
construtores em
nome e saldo da varivel $filme so inicializados no cdigo do construtor PHP
http://php.net/man
($this->nome = $nome; e $this->saldo = $saldo;). 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-a-
orientacao-a-
objetos-em-
php/26762
www.kadunew.com
/blog/php/introduc
ao-php-orientado-
a-objetos-objetos-
e-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
function __construct($numero, $saldo, $juros)
apresentam
{ informaes
parent::__construct($numero, $saldo); adicionais a
$this->juros = $juros; respeito dos
} conceitos de
orientao a
function creditar($valor) objetos em PHP e
{ herana.
parent::creditar($valor); http://php.net/man
$this->atualizarJuros(); ual/pt_BR/language
} .oop5.basic.php
http://josemalcher.
function atualizarJuros() net/heranca-php/
http://php.net/man
{
ual/pt_BR/language
$this->saldo = $this->saldo*(1 + $this->juros);
.oop5.inheritance.p
}
hp
}

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;
} Para definir a classe
como abstrata
utilizamos a palavra
public function perimetro()
chave abstract
{
antes da definio
return 2*$this->lado1 + 2*$this->lado2; da classe. O mesmo
} vale para os
} mtodos abstratos.
Observe tambm
$circ = new Circunferencia("Circunferencia", 10); que o mtodo
$circ->printCaracteristicas(); possui apenas
assinatura e no
possui corpo. Como
$retangulo = new Retangulo("Retangulo", 10, 20); ambas as classes
$retangulo->printCaracteristicas(); Circunferencia e
Retangulo herdam
?> de
FiguraGeometrica,
o mtodo
printCaracteristicas
Sada: pode ser chamado
sem problemas
Tipo: Circunferencia, Area 314, Perimetro 62.8 atravs de suas
Tipo: Retangulo, Area 200, Perimetro 60 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 IRepositorioContas{
public function cadastrar($conta);
public function remover($conta);
public function atualizar($conta);
}

Todos os repositrios que implantam os servios definidos em www.youtube.com/w


atch?v=S4DC7uRNrQE
IRepositrioContas devem conter os mtodos definidos na interface acima.

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.
Implemente em PHP a
classe Funcionario,
public Agencia implements IRepositorioContas { que tem como
public function cadastrar($conta) atributos o nmero de
{ dias trabalhados,
valor do ganho dirio
//Corpo da classe
e seu respectivo
} nome. Adicione
public function remover($conta) classe Funcionario um
{ mtodo que calcula o
//Corpo da classe seu salrio com base
no ganho dirio e nos
}
dias trabalhados.

39
Orientao a Objetos
Competncia 03
public function atualizar($conta)
{
//Corpo da classe
}
}

Pense na
Assim como objetos que herdam de alguma classe podem ser referenciados implementao da
classe gerente, que
pela superclasse, um objeto que referencia uma interface pode ser um tipo especial de
funcionrio, pois tem
referenciado por uma varivel com o tipo da Interface em questo. Por os mesmos atributos
de um funcionrio,
exemplo: mas seu salrio
calculado de forma
diferente, seu salrio
$contas1 = new Agencia(); fixado em 1000.00
$contas2 = new ObjetoQueImplementaIRepositorioContas(); reais. Tente
$contas2->inserir(new Conta()); implementar esta
$contas1->inserir(new Conta()); classe reusando o
cdigo da classe
//posso chamar sem medo os mtodos de IRepositorioContas.
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) Voc deve ter o
{ cuidado de saber o
//Caso ocorra algum erro, uma mensagem mostrada ao endereo de seu
usurio banco, a senha, o
echo "Erro" . mysqli_error(); login e o nome do
} banco. Caso algum
deles esteja errado,
ir aparecer uma
$sql = "DELETE FROM filme WHERE codigo = '2'";
mensagem de erro
//Executa a consulta informando.
$conexao->executarQuery($sql); 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/php-
orientado-a-
objetos-conexao-a-
banco-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-de-
software/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
Observe que o
elementos do array de filmes do banco. Para cada elemento do array, um nome do filme
obtido por meio do
boto alterar, para o nome do filme, e um boto excluir so inseridos. O mtodo getTitulo(),
cdigo final mostrado na Figura 9. pois o atributo
titulo da classe
Filme privado.
while($filmeTemporario = array_shift($filmes)) Alm disso, por
{ hora, os botes
?> alterar e excluir
<tr> esto sem
<td class="col-md-1"> funcionalidade
<a class="btn btn-default" href="#" implementada.
role="button">Alterar</a>
</td>

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


?> </td>

<td class="col-md-1">
Fique atento!
<a class="btn btn-danger" href="#"
Algumas partes do
role="button">Excluir</a>
cdigo no foram
</td> copiadas (observe o
</tr> nmero das linhas).
<?php 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
Figura 12 - Cdigo de incluir_filme.php.
ideia de incluir
Fonte: Prprio autor.
filmes.

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. Releia atentamente


Fonte: Prprio autor. o caderno de
Desenvolmento Web
para ver como a
4.7 Alterando Filmes estratgia de
alterao de dados.
O que vai mudar no
cdigo so as formas
Para a alterao de filmes iremos utilizar a mesma abordagem utilizada no como os campos do
caderno de Desenvolvimento Web para alterao de dados. Vamos utilizar formulrio so
preenchidos. No
uma varivel $destino que indicar se o formulrio vai enviar os dados caso orientado a
objeto, utilizamos
para a pgina incluir_filme.php ou alterar_filme.php (veja a seguir). As um objeto para
mostrar seus
respectivas fontes so mostradas nas Figuras 15 e 16. Na Figura 16 temos o 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

Das könnte Ihnen auch gefallen