Escolar Documentos
Profissional Documentos
Cultura Documentos
Bruno Silva
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
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
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
Competncia 01
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.
Competncia 01
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:
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
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>";
?>
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
14
Competncia 02
15
Competncia 02
2.2 Atributos
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.
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
17
Competncia 02
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
19
Competncia 02
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.
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.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
No exemplo acima (Figura 2) Cachorro herda diretamente de Mamfero, mas tambm herda
indiretamente de animal, haja vista que a herana transitiva.
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.
30
Competncia 03
Protected, visvel dentro da classe e em todas as classes que herdam desta classe.
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
?>
32
Competncia 03
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";
?>
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.
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
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
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
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.
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
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/
43
Competncia 04
44
Competncia 04
45
Competncia 04
46
Competncia 04
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
49
Competncia 04
Faa os mesmos passos que fizemos para Filmes com uma Classe funcionrio. Utilize a mesma
estrutura de funcionrios utilizada no caderno de Desenvolvimento Web.
50
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 pgina mostrada na Figura 12.
51
Competncia 04
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.
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.
53
Competncia 04
54
Competncia 04
55
Competncia 04
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