Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
a Objetos
Bacharel em Ciência da Computação (UFG)
Especializando em Engenharia de Software
13/02/2011 2
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 4 - Classes simples:
13/02/2011 3
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
Diagrama de Classe Class Php4
{
/**
* Atributos simples
*/
var $a;
var $b;
var $c;
/**
* Método construtor da classe PHP 4
* Métodos simples
*/
function Php4()
{
}
}
13/02/2011 4
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 5 - Classes mais completas e uso de padrões:
13/02/2011 5
Orientação a Objetos
• Introdução
– Diferenças entre o PHP 4 e o PHP 5
Diagrama de Classe Class Php5
{
/**
* Visibilidade de atributos
*/
private $a;
private $b;
private $c;
/**
* Método construtor da classe PHP 5
* Visibilidade de métodos
*/
public function __construct()
{
}
}
13/02/2011 6
Orientação a Objetos
• Escrevendo uma classe
– Toda definição de classe começa com a palavra-chave class,
seguido do nome_da_classe, que pode ser qualquer nome
que não seja uma palavra reservada no PHP.
13/02/2011 7
Orientação a Objetos
• Escrevendo uma classe
Class Nome_da_Classe
{
encapsulamento $atributos;
...
encapsulamento function nome_metodo( [argumento1, ...] )
{
/**
* Implementação do comportamento do método.
* Como uma função, um método pode retornar
* um valor se necessário.
*/
[return]
}
...
}
13/02/2011 8
Orientação a Objetos
• A variável $this
– Uma pseudo variável $this está disponível quando um
método da classe é chamado dentro de um contexto de
objeto.
Class Classe
{
encapsulamento $atributo;
...
encapsulamento function nome_metodo()
{
// A variável $this referencia o objeto
return $this->atributo;
}
...
}
13/02/2011 10
Orientação a Objetos
• Construtores e Destrutores
13/02/2011
} chamado explicitamente.
12
Orientação a Objetos
• Encapsulamento de atributos e métodos
– O encapsulamento (visibilidade) de um atributo ou método pode
ser definido prefixando a declaração com as palavras-chave:
• public
• protected
• private
13/02/2011 15
Orientação a Objetos
• Instanciando o objeto da classe
<?php
require_once './class/php4.php';
require_once './class/php5.php';
require_once './class/ConstrutorDestrutor.php';
require_once './class/Encapsulamento.php';
echo "<pre>";
print_r($oPhp4);
print_r($oPhp5);
print_r($oConstr);
print_r($oEncap);
$oConstr->__destruct();
print_r($oConstr);
13/02/2011 16
Orientação a Objetos
• Instanciando o objeto da classe
Saída:
Php4 Object
(
[a] =>
[b] =>
[c] =>
)
Php5 Object
(
[a:Php5:private] =>
[b:Php5:private] =>
[c:Php5:private] =>
)
ConstrutorDestrutor Object
(
[a:ConstrutorDestrutor:private] => 0
[b:ConstrutorDestrutor:private] => 0
)
Encapsulamento Object
(
[atributoPublico] =>
[atributoProtegido:protected] =>
13/02/2011 [atributoPrivado:Encapsulamento:private] => 17
)
Orientação a Objetos
• Exercitando
13/02/2011 18
Orientação a Objetos
• Herança - Conceitos
– Não é possível herdar classes múltiplas, uma classe só pode herdar uma
classe base (ou classe pai, ou ainda classe genérica).
13/02/2011 20
Orientação a Objetos
• Herança no PHP Diagrama de Classe
<?php
}
}
13/02/2011 22
Orientação a Objetos
• Herança no PHP
– Exemplo: Implementação prática.
class Dependentes extends Funcionario // Dependentes.php
{
private $dependentes = array();
public function __construct($dependentes)
{
$this->dependentes = $dependentes;
}
public function imprimeDadosFuncionario()
{
echo 'Matrícula: '.$this->getMatricula().'<br /><br />';
echo 'Nome: '.$this->getNome().'<br /><br />';
echo 'RG: '.$this->getRg().'<br /><br />';
echo 'Departamento: '.$this->getDepartamento().'<br /><br />';
echo 'Dependentes: <br />';
foreach ($this->dependentes as $value)
{
echo ' - '.$value.'<br />';
}
}
13/02/2011 } 23
Orientação a Objetos
• Herança no PHP
– Exemplo: … continuação da Implementação prática.
// appFuncDependentes.php Saída:
require_once './class/Funcionario.php';
require_once './class/Dependentes.php'; Ficha do funcionário: Matrícula: 777
13/02/2011 24
Orientação a Objetos
• Conversão da classe para string
– Impressão da classe:
// appToString.php
$funcionario = new Funcionario();
echo $funcionario;
– Erro:
Saída:
Catchable fatal error: Object of class Funcionario could not be converted to string in C:\...
– Resultado: Saída:
13/02/2011 25
Classe Funcionario
Orientação a Objetos
• Referência do objeto
– Sempre que uma variável do tipo objeto é atribuida a uma
outra variável, ele recebe somente a referência deste objeto.
– Tais variáveis referenciam exatamente o mesmo objeto.
// appReferenciaObjeto.php
$funcionario = new Funcionario();
$novoFuncionario = $funcionario;
$funcionario->setDepartamento('RH');
Saída:
A matrícula do funcionário é: RH
13/02/2011 26
Orientação a Objetos
• Clonagem de Objetos
– Necessário quando precisamos clonar um objeto, criando
outro espaço em memória ao invés de uma referência.
– Neste caso é criada uma nova instância do objeto, contendo
as mesmas propriedades e métodos.
// appClonagemObjeto.php
$funcionario = new Funcionario();
$novoFuncionario = clone $funcionario;
$funcionario->setDepartamento('RH');
echo "A matrícula do funcionário é: {$funcionario->getDepartamento()} <br />";
echo "A matrícula do funcionário é: {$novoFuncionario->getDepartamento()}";
Saída:
A matrícula do funcionário é: RH
13/02/2011 A matrícula do funcionário é: 27
Orientação a Objetos
• Atributos e Métodos Estáticos
13/02/2011 28
Orientação a Objetos
• Atributos e Métodos Estáticos
13/02/2011 29
Orientação a Objetos
• Atributos e Métodos Estáticos
Diagrama de Classe // Classe Matematica
class Matematica
{
public static function soma( $a, $b )
{
return $a + $b;
}
}
// appMatematica.php
Saída: $num1 = 4;
$num2 = 5;
9 echo Matematica::soma($num1, $num2);
-1 echo '<br />';
20 echo Matematica::subtracao($num1, $num2);
0.8 echo '<br />';
echo Matematica::multiplicacao($num1, $num2);
echo '<br />';
echo Matematica::divisao($num1, $num2);
13/02/2011 30
Orientação a Objetos
• Exercícios
– Primeira etapa do exercício:
• Transformar os métodos da classe Site em estáticos e testá-los. Esta alteração
na implementação será padrão para nossos projetos.
Diagrama de Classe
13/02/2011 31
Orientação a Objetos
• Exercícios
– Agora vamos criar uma classe utilitária chamada Util:
(1) 3 métodos: printVar(), printR() e printDump() para depurarmos (com as
funções print_r() e var_dump()) os dados em variáveis, arrays, objetos, etc.
(2) 1 Método httpRequest: para abstrair o acesso de variáveis de requisição
HTTP através dos métodos de envio de dados GET ou POST.
(3) 2 métodos setSession() e getSession() para recuperarmos e inserirmos dados
de sessão.
Diagrama de Classe
13/02/2011 32
Orientação a Objetos
• Overloading (Sobrecarga)
13/02/2011 34
Orientação a Objetos
• Overloading (Sobrecarga)
– Sobrecarga de métodos:
13/02/2011 35
Orientação a Objetos
• Overloading (Sobrecarga)
// FuncionarioOverloading.php
– Sobrecarregando os class FuncionarioOverloading
{
atributos da classe private $matricula = null;
private $nome = null;
private $rg = null;
Funcionario dos protected $departamento = null;
echo "<pre>";
print_r($funcionario);
$funcionario->__set('matricula','777');
$funcionario->__set('nome','George Mendonça');
$funcionario->__set('rg','1234567');
$funcionario->__set('departamento','Informática');
echo "<pre>";
print_r($funcionario);
FuncionarioOverloading Object
(
[matricula:FuncionarioOverloading:private] =>
[nome:FuncionarioOverloading:private] =>
[rg:FuncionarioOverloading:private] =>
[departamento:protected] =>
)
FuncionarioOverloading Object
(
[matricula:FuncionarioOverloading:private] => 777
[nome:FuncionarioOverloading:private] => George Mendonça
[rg:FuncionarioOverloading:private] => 1234567
[departamento:protected] => Informática
)
Dados do funcionário
- Matrícula: 777
- Nome: George Mendonça
13/02/2011 - RG: 1234567 38
- Departamento: Informática
Orientação a Objetos
• Iteração de Objetos
13/02/2011 39
Orientação a Objetos
• Iteração de Objetos
Diagrama de Classe
Class Iteracao
{
public $nome = "George";
13/02/2011 43
Orientação a Objetos
• Reflection API
// appReflexao.php
$refClasslIter = new ReflectionClass('IteracaoObjetos');
$refClasslFunc = new ReflectionClass('Funcionario');
13/02/2011 45
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
– Limitação do self::
• Em um contexto de herança, por exemplo, referências estáticas são
resolvidas usando a classe na qual foi definida, ou seja, a qual
pertence. Mas não na classe a qual foi chamada em tempo de
execução.
13/02/2011 47
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
13/02/2011 48
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
class X // LateStaticBindings.php // appLateStaticBindings.php
{ TesteX::chamaClasse();
public static function imprimeClasse()
{
echo 'Eu sou a classe '.__CLASS__;
}
13/02/2011 50
Orientação a Objetos
• Late Static Bindings (PHP 5.3)
class Y // LateStaticBindings.php // appLateStaticBindings.php
{ TesteX::chamaClasse();
public static function imprimeClasse() echo '<br />';
{ TesteY::chamaClasse();
echo 'Eu sou a classe '.__CLASS__;
}
13/02/2011 52
Orientação a Objetos
• Autoload – Carregando classes automaticamente
– Com a função __autoload quando você tentar usar uma
classe/interface que ainda não foi definida, o script engine
tem uma última chance para carregar a classe antes que o
PHP aponte o erro.
13/02/2011 53
Orientação a Objetos
• Autoload – Carregando classes automaticamente
– Implementação básica:
function __autoload( $classe )
{
require_once "{$classe}.php";
}
Saída:
Classe Funcionario
16
==========================================================
Arquivo: C:\Program Files\Zend\Apache2\htdocs\php5.3-objetos\appAutoloadClasses.php
Linha: 17
==========================================================
Funcionario Object
(
[matricula:Funcionario:private] =>
[nome:Funcionario:private] =>
[rg:Funcionario:private] =>
[departamento:protected] =>
)
13/02/2011 55
Orientação a Objetos
• Autoload – Carregando classes automaticamente
– Avaliação prática:
• E se as classes estiverem separadas em diretórios diferentes? Como
por exemplo nas seguintes pastas:
model/…
view/…
controller/…
13/02/2011 56
Orientação a Objetos
• Constantes do Objeto
– É possível definir valores constantes em cada classe,
permanecendo os mesmos e imutáveis.
// Classe CadastroEmpresas.php
class CadastroEmpresas
{
const TITULO_TELA = "Cadastro de Empresas";
const NOME = "Nome:";
const CNPJ = "CNPJ:";
const RAZAO_SOCIAL = "Razão Social:";
const BOTAO_SUBMIT = " >> Salvar ";
}
13/02/2011 59
Orientação a Objetos
• Constantes do Objeto
– Implementação básica:
// appConstantesdaClasse.php
echo
"<p><strong>".CadastroEmpresas::titulo_tela."</strong></p>
<form>
".CadastroEmpresas::nome." <input type='text' value='' /><br />
".CadastroEmpresas::cnpj." <input type='text' value='' /><br />
".CadastroEmpresas::razao_social." <input type='text' value='' /><br /><br />
<input type='submit' value='".CadastroEmpresas::botao_submit."' />
</form>";
Saída:
13/02/2011 60
Orientação a Objetos
• Classes e Métodos Abstratos
– PHP 5 introduz métodos e classes abstratos.
– Não é permitido criar uma instância de uma classe que foi definida
como abstrata.
13/02/2011 61
Orientação a Objetos
• Classes e Métodos Abstratos
– Quando uma classe herda uma classe abstrata, todos os métodos
marcados como abstratos na declaração da classe pai devem ser
definidos na classe filha.
13/02/2011 63
Orientação a Objetos
• Classes e Métodos Abstratos
– Exemplo 01 - Classe Orcamento (herda a classe Venda)
// Classe Orcamento.php
class Orcamento extends Venda
{
private $taxa = array('cheque' => 1.10, 'cartao' => 1.18 );
// appVenda.php
$venda = new Orcamento();
Saída:
$venda->__set('valor', 90);
$venda->__set('desconto', 10); === Orçamento ===
echo "<strong> === Orcamento === </strong><br /><br />";
echo "Preco: {$venda->__get('valor')}<br />"; Preço: 90
echo "Desconto: {$venda->__get('desconto')}<br />"; Desconto: 10
echo "A vista: {$venda->vendaVista()}<br />"; À vista: 80
echo "Cheque: {$venda->vendaCheque()}<br />"; Cheque: 89
echo "Cartao: {$venda->vendaCartao()}<br />"; Cartão: 96.2
13/02/2011 65
Orientação a Objetos
• Classes e Métodos Abstratos
– Exemplo 02 – Adição do método abstrato imprimeOrcamento
// Classe Abstrata Venda.php
abstract class Venda
{
private $valor = 0.0;
private $desconto = 0.0;
13/02/2011 67
Orientação a Objetos
• Classes e Métodos Abstratos
– Exemplo 02 – Adição do método abstrato imprimeOrcamento
// appVenda.php
$a = Util::httpRequest('a');
$b = Util::httpRequest('b');
13/02/2011 69
Orientação a Objetos
• Interfaces
– Todos os métodos declarados em uma interface devem ser public, essa é
a natureza de uma interface. Para implementar uma interface, o
operador implements é usado.
Nota: Uma classe não pode implementar duas interfaces que compartilham
13/02/2011 o mesmo nome uma vez que isso causaria ambiguidade. 70
Orientação a Objetos
• Interfaces
– Exemplo 01 - Interface OperacoesMatematicas
// Interface IOperacoesMatematicas.php
interface IOperacoesMatematicas
{
public static function soma($x, $y);
13/02/2011 71
Orientação a Objetos
• Interfaces
– Exemplo 01 – Classe OpMatematicas que implementa a interface
OperacoesMatematicas
// Classe OpsMatematicas.php
class OpMatematicas implements IOperacoesMatematicas
{
public static function soma($x, $y){ return $x + $y; }
public static function subtracao($x, $y) { return $x - $y; }
public static function multiplicacao($x, $y) { return $x * $y; }
public static function divisao($x, $y)
{
return ($y <> 0) ? $x / $y : 'Divsao por zero!';
}
public static function imprimeOperacoes($a, $b)
{
echo "<b>As operacoes matematicas entre $a e $b sao</b>: <br />";
echo "Soma: ".OpMatematicas::soma($a, $b)."<br />";
echo "Subtracao: ".OpMatematicas::subtracao($a, $b)."<br />";
echo "Multiplicacao: ".OpMatematicas::multiplicacao($a, $b)."<br />";
echo "Divisao: ".OpMatematicas::divisao($a, $b)."<br />";
}
13/02/2011 } 72
Orientação a Objetos
• Interfaces
– Exemplo 01 – Aplicação appOpMatematicas
// appOpMatematicas.php
$a = Util::httpRequest('a');
$b = Util::httpRequest('b');
13/02/2011 74
Orientação a Objetos
• Polimorfismo
interface IAnuncioImobiliaria // IAnuncioImobiliaria.php
{
public static function imprimeDados();
}
// appAnuncios.php
echo '<b>Anúncio imobiliário</b>: <br /><br />';
Anuncio1::imprimeDados();
echo '<br />';
Anuncio2::imprimeDados();
echo '<br />';
Anuncio3::imprimeDados();
Saída:
Anúncio imobiliário:
13/02/2011 76
Orientação a Objetos
• Exceções
– PHP 5 tem um modelo de exceção é similar ao de outras
linguagens de programação. Uma exceção pode ser disparada
(thrown), ou pega (caught ou "catched") no PHP.
13/02/2011 77
Orientação a Objetos
• Exceções
– Vários blocos catch podem ser usados para pegar diferentes
classes de exceções.
– A execução normal (quando nenhuma exceção é disparada
dentro de um bloco try ou quando um catch compatível com
a classe da exceção disparada não estiver presente)
continuará após o último bloco catch definido na sequência.
– Exceções podem ser disparadas (ou re-disparadas) dentro de
um bloco catch.
13/02/2011 78
Orientação a Objetos
• Exceções
– Quando uma exceção é disparada, o código logo após à
instrução não será executada, e o PHP tentará achar o
primeiro bloco catch correspondente à exceção disparada.
13/02/2011 79
Orientação a Objetos
• Exceções
– Criando uma classe de Exceção para uma classe
// DivisaoException.php
class DivisaoException extends Exception {}
// Divisao.php
class Divisao
{
public function __construct($a, $b)
{
if ($b == 0)
{
throw new DivisaoException('Erro - Divisão por zero!');
}
}
}
13/02/2011 80
Orientação a Objetos
• Exceções
– Criando uma aplicação para disparar a Exceção
// appException.php
try
{
$divisao = new Divisao(5, 0);
}
catch (DivisaoException $e)
{
echo "Mensagem: {$e->getMessage()} <br />
Linha: {$e->getLine()} <br />
Arquivo: {$e->getFile()} <br />
Codigo: {$e->getCode()}";
}
Saída:
13/02/2011 82
Orientação a Objetos
• Simple XML
– Criando o arquivo XML
// Arquivo biblioteca.xml
<?xml version="1.0" encoding="UTF-8"?>
<biblioteca>
<categoria id="tecnico">
<livro>
<titulo>PHP 5 - Programação Poderosa</titulo>
<autor>Andi Gutmans, Stig Bakken, Derick Rethans</autor>
</livro>
<livro>
<titulo>Zend Framework in Action</titulo>
<autor>Rob Allen</autor>
</livro>
</categoria>
</biblioteca>
13/02/2011 83
Orientação a Objetos
• Simple XML
– Criando uma aplicação com a extensão
// appSimpleXml.php
$biblioteca = simplexml_load_file('./inc/biblioteca.xml');
foreach ($biblioteca->categoria as $categoria)
{
echo "Categoria: " . $categoria['id'] . '<br>';
foreach ($categoria->livro as $livro)
{
echo "Titulo: " . $livro->titulo . '<br>';
echo "Autor: " . $livro->autor . '<br>';
}
}
Saída:
Categoria: Técnico
Titulo: PHP 5 - Programação Poderosa
Autor: Andi Gutmans, Stig Bakken, Derick Rethans
13/02/2011 Titulo: Zend Framework in Action 84
Autor: Rob Allen
Orientação a Objetos
• Padrões de Projeto
orientados a objetos.
13/02/2011 85
Orientação a Objetos
• Padrões de Projeto
– Objetivos
• Reutilização de código
13/02/2011 86
Orientação a Objetos
• Padrões de Projeto
– Singleton
• O Design Pattern Singleton é um dos padrões de projetos mais fáceis
que existe. Ele que garante a existência de uma única instância de
uma determinada classe para um objeto, mantendo um ponto global
de acesso ao seu objeto.
13/02/2011 87
Orientação a Objetos
• Singleton
– Criando a classe
// Classe Singleton.php
class Singleton
{
// instancia da classe
private static $objDaClasse = null;
13/02/2011 89