Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Orientao a Objetos
Bruno Silva
2015
Presidenta da Repblica
Dilma Vana Rousseff
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
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
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
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:
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>";
?>
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>";
?>
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>";
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);
}
}
$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;
}
}
?>
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;
}
}
?>
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
17
Orientao a Objetos
Competncia 02
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
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;
}
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.
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
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
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();
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
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
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
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;
}
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
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();
Sada:
Tipo:
Circunferencia,
Area
314,
Tipo: Retangulo, Area 200, Perimetro 60
Perimetro
62.8
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);
www.youtube.com/w
atch?v=S4DC7uRNrQE
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.
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);
42
Tcnico em Informtica
Competncia 04
43
Orientao a Objetos
Competncia 04
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
46
Tcnico em Informtica
Competncia 04
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/
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();
?>
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.
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
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.
53
Orientao a Objetos
Competncia 04
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.
54
Tcnico em Informtica
Competncia 04
Desenvolvimento Web. A Figura 13 apresenta a alterao em questo.
Implemente a
funcionalidade de
remover funcionrio.
Utilize a mesma ideia
de remover filmes.
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).
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.
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
61
Orientao a Objetos