Você está na página 1de 62

Orientao a Objetos

Bruno Silva

Curso Tcnico em Informtica


Educao a Distncia
2016

EXPEDIENTE
Professor Autor
Bruno Silva
Design Instrucional
Deyvid Souza Nascimento
Maria de Ftima Duarte Angeiras
Renata Marques de Otero
Terezinha Mnica Sincio Beltro
Reviso de Lngua Portuguesa
Letcia Garcia
Diagramao
Izabela Cavalcanti
Coordenao
Anderson Elias
Coordenao Executiva
George Bento Catunda
Coordenao Geral
Paulo Fernando de Vasconcelos Dutra

Contedo produzido para os Cursos Tcnicos da Secretaria Executiva de Educao


Profissional de Pernambuco, em convnio com o Ministrio da Educao
(Rede e-Tec Brasil).
Agosto, 2016

Catalogao na fonte
Bibliotecrio Hugo Carlos Cavalcanti, CRB4-2129

S586o
Silva, Bruno.
Orientao a Objetos: Curso Tcnico em Informtica:
Educao a distncia / Bruno Silva. Recife: Secretaria
Executiva de Educao Profissional de Pernambuco, 2016.
59 p.: il.
Inclui referncias bibliogrficas.
1. Educao a distncia. 2. Programao orientada a
objetos (Computao). 3. Classes e objetos. 4. Java
(Linguagem de programao de computador). I. Silva, Bruno.
II. Ttulo. III. Secretaria Executiva de Educao Profissional de
Pernambuco. IV. Rede e-Tec Brasil.
CDU 681.32.06

Sumrio
Introduo ........................................................................................................................................ 5
1.Competncia 01 | Princpios e Importncia da Orientao a Objetos ............................................. 6
1.1 Histrico e Comparao com Linguagens Estruturadas ......................................................................... 6
1.2 Exemplo: Programao Estruturada Versus POO ................................................................................... 8

2.Competncia 02 | Conceitos de Classe, Herana, Objeto, Atributo e Mtodo ............................... 15


2.1 Conceitos Fundamentais ......................................................................................................................15
2.2 Atributos .............................................................................................................................................16
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 .....................................................................................................................30
3.3 Mtodos Get e Set ...............................................................................................................................33
3.4 Classes Abstratas .................................................................................................................................34
3.5 Interfaces ............................................................................................................................................37

4.Competncia 04| Utilizando Tcnicas de Orientao a Objetos em uma Aplicao ...................... 39


4.1 Conectando ao MySQL.........................................................................................................................39
4.2 Classe Bsica Filme ..............................................................................................................................43
4.3 Repositrio de Dados...........................................................................................................................44
4.4 Listando Dados ....................................................................................................................................47
4.5 Incluindo Novos Filmes ........................................................................................................................50

4.6 Removendo Filmes ..............................................................................................................................52


4.7 Alterando Filmes .................................................................................................................................53

Concluso ........................................................................................................................................ 57
Referncias ..................................................................................................................................... 58
Minicurrculo do Professor .............................................................................................................. 59

Introduo
Caro estudante,
Seja bem-vindo disciplina de Orientao a Objetos.
Por meio do uso de 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 web, utilizando o paradigma orientado a objetos.
Neste mdulo, ampliaremos os conceitos aprendidos na matria de Linguagem de Programao
para Web, no que diz respeito 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.
O contedo do caderno dividido em quatro partes principais.
Introduo, onde so apresentados 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).
Espero que voc aproveite bem essa disciplina.

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. Aqui aprenderemos alguns conceitos 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 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.
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

Competncia 01

chamada vrias vezes durante a execuo do programa.


Nas prximas linhas so mostradas algumas dicas de como resolver problemas em geral 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.
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 topdown possui algumas limitaes como as listadas a seguir.

Esta abordagem 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 usando 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 tornavam-se mais
modulares, 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 subrotinas 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:

Competncia 01

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.

Para conhecer um pouco mais sobre o histrico das linguagens orientadas a objetos acesse:
https://pt.wikibooks.org/wiki/Programa%C3%A7%C3%A3o_Orientada_a_Objetos/Introdu%C3%A
7%C3%A3o

1.2 Exemplo: Programao Estruturada Versus POO


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

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 e $joaoDescontos. <br>";
echo "O valor do desconto de $mariaNome e $mariaDescontos. <br>";
echo "O valor do desconto de $joseNome e $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.

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 e $joaoDescontos. <br>";
echo "O valor do desconto de $mariaNome e $mariaDescontos. <br>";
echo "O valor do desconto de $joseNome e $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 (ou vetor)
seria til para guardar o conjunto de funcionrios dessa empresa. O cdigo a seguir apresenta essa
mesma implantao, utilizando arrays.

10

Competncia 01

Exemplo 3
<?php
function calcularDescontos($salario, $previdencia)
{
return round($salario*0.275 + $previdencia,2);
}
$funcionarios = array(3);
$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 < 3; $i++)
{
$nome = $funcionarios[$i][0];
$descontos
=
calcularDescontos($funcionarios[$i][1],
$funcionarios[$i][2]);
echo "O valor do desconto de $nome e $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.

11

Competncia 01

Exemplo 4
<?php
class Funcionario{
public $nome;
public $salario;
public $previdencia;
public $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 (class
Funcionario Linhas 2). 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, previdncia e descontos 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 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,

12

Competncia 01

para funcionrios com salrio entre 1000 e 1999 o tipo do 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.
<?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>";
}
?>

13

Competncia 01

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.

Nos links a seguir o aluno poder visualizar outras explicaes que mostram a diferena entre o
paradigma estruturado e orientado a objetos.
www.devmedia.com.br/programacao-orientada-a-objetos-versus-programacaoestruturada/32813

Vdeos demonstrativos sobre diferena entre programao estruturada e orientada a objetos.


www.youtube.com/watch?v=vhvmZfxZhPw
www.youtube.com/watch?v=PmefpISZ7Ew

14

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 reutilizados em outras linguagens orientadas a objetos.

2.1 Conceitos Fundamentais


Objetos so pores de software descritas 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 funes. 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.
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

Competncia 02

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 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 que podem ser utilizados durante a
computao.

Mtodos podem 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 corresponde a uma descrio do que o mtodo deve
fazer 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.
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

16

Competncia 02

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/manual/pt_BR/language.oop5.basic.php

Veja tambm esses vdeos:


www.youtube.com/watch?v=9bQNsfYqVc4
www.youtube.com/watch?v=UM9YBFqIwQ4

2.4 Trabalhando com Objetos


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

17

Competncia 02

Figura 1 - Acessando Objetos


Fonte: Prprio autor (2014)
Descrio: Um objeto presente na memria do computador acessado por uma varivel descrita no problema. Portanto, ao criar um objeto, a varivel no representa o objeto em si, mas
uma forma de acess-lo.

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. Por exemplo, a linha a seguir cria um novo objeto Filme cujo nome
Exterminador e possui saldo 100 (Ver Exemplo 9).
$filme = new Filme("Exterminador", 100);

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

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

Veja esse site que apresenta uma descrio mais detalhada sobre construtores em PHP
http://php.net/manual/pt_BR/language.oop5.decon.php

Construtores no possuem um retorno e utilizam a instruo __construct. Para que um


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

19

Competncia 02

2.7 O Operador $this


O operador $this do PHP indica 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

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>";
?>

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

21

Competncia 02

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

22

Competncia 02

Links teis:
www.devmedia.com.br/introducao-a-orientacao-a-objetos-em-php/26762
www.kadunew.com/blog/php/introducao-php-orientado-a-objetos-objetos-e-classes

23

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 apenas relacionada a contratar programadores baratos
(e talvez 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 de apenas uma
superclasse;
2.
Funciona como uma hierarquia.

24

Competncia 03

Figura 2 - Hierarquia de classes


Fonte: Prprio autor
Descrio: Na Figura pode-se ver a hierarquia de classes de vrios tipos de animais na linguagem php. Nesse caso especfico, um animal corresponde classe pai. Um Mamfero corresponde a uma classe filha de Animal. Nesse caso, pode-se dizer que um Mamfero herda de
Animal ou um Mamfero um tipo de Animal.

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{}


No Exemplo 12, veja como a classe poupana herda da classe conta e utiliza os mtodos da classe
conta mesmo sem os ter definido. Como se sabe, uma poupana bancria um tipo especial de
conta que possui uma taxa de juros que aplicada ao saldo em perodos determinados.
Nesse exemplo, veremos como simples herdar o comportamento da classe Conta na classe
Poupanca. Observe que na classe Poupanca, 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
(pois estes so herdados da classe Conta). Portanto, pode ser chamada diretamente sem maiores
problemas.

25

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);
//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>";
?>

26

Competncia 03

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;
}
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;
}

27

Competncia 03

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>";
?>

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;
}

28

Competncia 03

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)
{
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 porque, caso haja uma alterao no cdigo do construtor da classe Conta, a
alterao ser feita apenas na classe Conta.
possvel tambm alterar o comportamento de uma determinada classe reutilizando o cdigo da

29

Competncia 03

superclasse. Por exemplo, se no caso da poupana todo crdito fosse seguido de uma atualizao
de juros. Nesse caso, teramos 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 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 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.

30

Competncia 03

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

31

Competncia 03

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 cdigo do 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.
Exemplo 18
class Poupanca extends Conta{
protected $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);
}
}

32

Competncia 03

Os links abaixo apresentam informaes adicionais a respeito dos conceitos de orientao a


objetos em PHP e herana.
http://php.net/manual/pt_BR/language.oop5.inheritance.php

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

33

Competncia 03

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";
?>

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

34

Competncia 03

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.

Figura 3 - Esquema de classes para Figura Geomtrica.


Fonte: Prprio autor
Descrio: Uma classe do tipo FiguraGeometrica possui como classes filhas Quadrado
e Circunferencia. Ou seja, Quadrado e Circunferencia herdam de FiguraGeometrica.

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,
$perimetroTemp<br>";
}

Perimetro

35

Competncia 03

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;
}
public function area()
{
return 3.14*$this->raio*$this->raio;
}
public function perimetro()
{
return 2*3.14*$this->raio;
}
}
class Retangulo extends FiguraGeometrica{
private $lado1, $lado2;
public function __construct($tipo, $lado1, $lado2)
{
parent::__construct($tipo);
$this->lado1 = $lado1;
$this->lado2 = $lado2;
}
public function area()
{
return $this->lado1*$this->lado2;
}
public function perimetro()
{
return 2*$this->lado1 + 2*$this->lado2;
}
}
$circ = new Circunferencia("Circunferencia", 10);
$circ->printCaracteristicas();
$retangulo = new Retangulo("Retangulo", 10, 20);
$retangulo->printCaracteristicas();
?>

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

36

Competncia 03

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

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 contendo apenas mtodos abstratos.
Exemplo de Interface:
interface
public
public
public
}

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

www.youtube.com/watch?v=S4DC7uRNrQE

Todos os repositrios que implantam os servios definidos em IRepositrioContas devem conter os


mtodos definidos na interface acima.

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.

Por exemplo, uma classe Agencia poderia implantar esta interface em particular. Precisamos

37

Competncia 03

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

Pense na implantao 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.

Assim como objetos herdados 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.

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 referncia a um Tipo Media. Faa a
questo usando interface e depois use classe abstrata.

38

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 alguns de vocs
devem conhecer da Disciplina Linguagem de Programao para Web. Vamos neste caderno
reaproveitar o projeto da disciplina de Linguagem de Programao para Web e modificar o cdigo
para que siga o padro orientado a objetos. Vamos tambm 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.
Descrio: Tela do projeto Popcorn TV com campos para incluir filme, sinopse, quantidade e trailer. Alm disso,
filmes podem ser cadastrados e excludos utilizando-se os botes na parte inferior da tela.

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 Linguagem de Programao para Web que
l voc encontrar as informaes 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

39

Competncia 04

Linguagem de Programao 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.

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

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);

40

Competncia 04

41

Competncia 04

Figura 5 - Classe Conexo.


Fonte: Prprio autor.
Descrio: Cdigo de conexo com o banco de dados.

42

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.escolacriatividade.com/php-orientado-a-objetos-conexao-a-banco-de-dados/

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.

43

Competncia 04

Figura 6 - Classe Filme.


Fonte: Prprio autor.
Descrio: Classe bsica filmes.

4.3 Repositrio de Dados


Para acesso s informaes do banco de dados 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.

Figura 7 - Esquema de acesso aos dados do Sistema.


Fonte: Prprio autor.
Descrio: Aplicao web (cdigo html e css) pode-se encontrar o repositrio,
a classe de conexo com o banco de dados e o banco propriamente dito.

44

Competncia 04

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

45

Competncia 04

46

Competncia 04

Figura 8 - Classe de repositrio dos dados.


Fonte: Prprio autor.
Descrio: Classe repositrio de dados. Nela o cliente pode cadastrar, remover e obter a lista de filmes do usurio.

O repositrio de dados um padro de projeto muito utilizado em orientao a objetos. Veja


mais conceitos relacionados a este tema em:
http://sergiotaborda.wordpress.com/desenvolvimento-de-software/java/patterns/repository/

4.4 Listando Dados


Vamos agora listar os dados da tabela filmes e apresent-los na tela. Caso voc no se lembre, olhe
no caderno de Linguagem de Programao para 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 de
dados. O trecho de cdigo mostrado a seguir:

47

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.

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 de dados. Observe que existe um loop (while)
que varre todos os elementos do array de filmes do banco. Para cada elemento do array, um boto
alterar, para o nome do filme, e um boto excluir so inseridos. O cdigo final mostrado na Figura
9.
while($filmeTemporario = array_shift($filmes))
{
?>
<tr>
<td class="col-md-1">
<a class="btn btn-default" href="#"
role="button">Alterar</a>
</td>
<td class="col-md-6"> <?php echo $filmeTemporario->getTitulo() ?>
</td>
<td class="col-md-1">
<a class="btn btn-danger" href="#" role="button">Excluir</a>
</td>
</tr>
<?php
}
?>

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

48

Competncia 04

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


Fonte: prprio autor.
Descrio: Resultado da insero do cdigo mencionado no texto acima.

O resultado pode ser visto na Figura 10.

49

Competncia 04

Figura 10 - Listagem de Filmes.


Fonte: Prprio autor.
Descrio: Tela do Popcorn TV. Mesma descrio da Figura 4.

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

4.5 Incluindo Novos Filmes


Agora que podemos listar os filmes cadastrados no banco de dados, vamos aprender como
adicionar informaes no banco de 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 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.

50

Competncia 04

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


Fonte: Caderno de Desenvolvimento para Web EAD-PE.
Descrio: Cdigo que envia os dados de insero. Na Linha 34, o tipo do formulrio foi ajustado para que as informaes fossem redirecionadas para incluir_filme.php

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

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 pgina mostrada na Figura 12.

Figura 12 - Cdigo de incluir_filme.php.


Fonte: Prprio autor.
Descrio: Forma de envio de dados para repositrio. Na linha 8, o cadastro de filmes realizado pela funo
cadastrarFilme do repositrio.

51

Competncia 04

4.6 Removendo Filmes


Para que possamos remover um filme, necessrio o 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
Linguagem de Programao para 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.
Descrio: Forma de redirecionamento do cdigo do filme para excluso. A referncia do boto excluir filme feita para
a pgina excluir_filme.php e o cdigo passado aps o sinal de interrogao ? com a respectiva referncia do cdigo
do filme.

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

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.

Figura 14 - Cdigo fonte de excluir_filme.php.


Fonte: Prprio autor.
Descrio: O mtodo excluir filmes do repositrio chamado na pgina excluir_filme.php passando o cdigo do
filme da pgina mostrada na Figura 13.

52

Competncia 04

Releia atentamente o caderno de Linguagem de Programao para 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.

4.7 Alterando Filmes


Para a alterao de filmes iremos utilizar a mesma abordagem utilizada no caderno de Linguagem
de Programao para Web para alterao de dados. Vamos utilizar uma varivel $destino que
indicar se o formulrio vai enviar os dados para a pgina incluir_filme.php ou alterar_filme.php
(veja a seguir). As respectivas fontes so mostradas nas Figuras 15 e 16. Na Figura 16 temos o
arquivo contendo todas as funcionalidades anteriores (exemplo: remover, inserir).

Figura 15 - Cdigo de alterar filme.


Fonte prprio autor.
Descrio: O cdigo da pgina Alterar Filmes mostrado na figura. As informaes do filme so passadas pelo
formulrio da pgina principal e um novo filme enviado para o banco de dados pela classe repositrio.

53

Competncia 04

54

Competncia 04

Figura 16 - Cdigo fonte index.php.


Fonte: Prprio autor.
Descrio: Cdigo completo da classe index.php. Nela possvel cadastrar, remover e atualizar filmes de uma locadora
virtual.

55

Competncia 04

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

56

Concluso
Este caderno apresenta um guia introdutrio sobre orientao a objetos, utilizando como base a
linguagem PHP. Apesar de focar na linguagem PHP, os conceitos apresentados aqui so genricos o
suficiente para serem aplicados em outras linguagens que usam 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.

57

Referncias
ARAJO, Everton Coimbra. Orientao a objetos com java. Santa Catarina: Visual Books, 2008.
CURSO de PHP Orientado a Objetos - Aula 01 - Criando Classes. Hugo Vasconcelos. Disponvel em:
<https://www.youtube.com/watch?v=rAkJOH5Gz7U>. Acesso em: 29 jul. 2016.
DALLOGLIO, Pablo. PHP Programando com orientao a objetos. 2.ed. So Paulo: Novatec, 2009.
MENDES, Douglas Rocha. Programao Java: com nfase em orientao a objetos. So Paulo:
Novatec, 2009.
SINTES, Anthony. Aprenda programao orientada a objetos em 21 dias. So Paulo: Pearson, 2002.
XAVIER, Fabrcio S. V. PHP: do bsico orientao de objetos. Rio de Janeiro: Cincia Moderna,
2008.

58

Minicurrculo do Professor

Bruno Silva

Formado em Engenharia da Computao pela UFPE, com mestrado em Cincia da Computao pela
UFPE e doutorado pela UFPE e pela Technische Universitat Ilmenau. Foi professor da Universidade
Federal Rural de Pernambuco. Participou de projetos de cooperao cientfica entre Brasil e
Empresas internacionais como EMC, HP e Foxconn. Atualmente cientista da IBM Research Brasil.
www.brunosilva.me

59

Você também pode gostar