O documento apresenta um resumo sobre orientação a objetos em PHP, abordando tópicos como: classes, atributos, métodos, encapsulamento, herança, instanciação de objetos, conversão para string e referência vs clonagem.
Slides Lição 05, Central Gospel, A Grande Tribulação, 1Tr24.pptx
PHP 5.3 - Classes e Objetos
1. Bacharel em Ciência da Computação (UFG)
Especializando em Engenharia de Software
Analista de Sistemas – SIGMA / MDIC
Professor Formador EAD – NEAD/ETEB
george@georgemendonca.com.br
http://www.georgemendonca.com.br
Orientação
a Objetos
2. • Introdução
– No PHP 5 foi desenvolvido um novo Modelo de Objetos.
– O tratamento de objetos foi completamente reescrito,
permitindo uma performance melhor e mais vantagens.
– Versão atual: PHP 5.3.
Orientação a Objetos
13/02/2011 2
3. • Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 4 - Classes simples:
– Uma tentativa a orientação à objetos
– Porém sem muitos conceitos considerados importantes para uma
linguagem orientada a objetos
Orientação a Objetos
13/02/2011 3
4. • Introdução
– Diferenças entre o PHP 4 e o PHP 5
Orientação a Objetos
13/02/2011 4
Class Php4
{
/**
* Atributos simples
*/
var $a;
var $b;
var $c;
/**
* Método construtor da classe PHP 4
* Métodos simples
*/
function Php4()
{
}
}
Diagrama de Classe
5. • Introdução
– Diferenças entre o PHP 4 e o PHP 5
• PHP 5 - Classes mais completas e uso de padrões:
– Com implementação de recursos semelhantes às linguagens de
programação como C++ e Java.
Orientação a Objetos
13/02/2011 5
6. • Introdução
– Diferenças entre o PHP 4 e o PHP 5
Orientação a Objetos
13/02/2011 6
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()
{
}
}
Diagrama de Classe
7. • 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.
– Seguido por um par de chaves “ { } “, que contém a definição
dos atributos (ou propriedades) e métodos da classe.
Orientação a Objetos
13/02/2011 7
8. • Escrevendo uma classe
Orientação a Objetos
13/02/2011 8
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]
}
...
}
9. • 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.
– Sua implementação normalmente se encontra dentro do
escopo de um método.
– $this é uma referência para o objeto que chama o método ou
o atributo.
Orientação a Objetos
13/02/2011 9
10. • A variável $this
Orientação a Objetos
13/02/2011 10
Class Classe
{
encapsulamento $atributo;
...
encapsulamento function nome_metodo()
{
// A variável $this referencia o objeto
return $this->atributo;
}
...
}
11. • Construtores e Destrutores
– PHP 5 permite que os desenvolvedores declarem métodos
construtores para as classes. Isto é feito através do método mágico
__construct().
– Classes que tem um método construtor chamam esse método cada
vez que um objeto novo é criado, sendo apropriado para qualquer
inicialização que o objeto possa vir a precisar no momento em que
é instanciado.
Orientação a Objetos
13/02/2011 11
Nota: Construtores pais não são chamados implicitamente se a classe filha define
um construtor. Para executar o construtor da classe pai, uma chamada a
parent::__construct() dentro do construtor da classe filha é necessária.
12. • Construtores e Destrutores
Orientação a Objetos
13/02/2011 12
Class ConstrutorDestrutor
{
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function __destruct()
{
$this->a = null;
$this->b = null;
}
}
Diagrama de Classe O construtor da classe
inicializa os valores dos
atributos do objeto caso
necessário.
Libera o espaço em
memória reservado para o
objeto no encerramento
do script ou quando
chamado explicitamente.
13. • 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
– Public podem ser acessados por todo script.
– Protected limita o acesso a classes herdadas e para classe que
define o objeto.
– Private limita a visibilidade para apenas a classe que define o
objeto.
Orientação a Objetos
13/02/2011 13
14. • Encapsulamento de atributos e métodos
Orientação a Objetos
13/02/2011 14
Class Encapsulamento
{
// Visível em todo o script
public $atributoPublico;
// Visível nas classes e subclasses
protected $atributoProtegido;
// Visível apenas na classe
private $atributoPrivado;
public function metodoPublico()
{
// Visível em todos os scripts
}
protected function metodoProtegido()
{
// Visível em classes e subclasses
}
private function metodoPrivado()
{
// Visível apenas na classe
}
}
Diagrama de Classe
15. • Instanciando o objeto da classe
– Para criar uma instância de um objeto da classe, um novo objeto
deve ser criado (instanciado) e atribuído à uma variável.
– Para tanto é necessário a chamada da palavra reservada new
seguido do nome da classe para criar um novo objeto, instanciando
então a classe (ou um objeto da classe).
Orientação a Objetos
13/02/2011 15
16. • Instanciando o objeto da classe
Orientação a Objetos
13/02/2011 16
<?php
require_once './class/php4.php';
require_once './class/php5.php';
require_once './class/ConstrutorDestrutor.php';
require_once './class/Encapsulamento.php';
$oPhp4 = new Php4();
$oPhp5 = new Php5();
$oConstr = new ConstrutorDestrutor(1, 2);
$oEncap = new Encapsulamento();
echo "<pre>";
print_r($oPhp4);
print_r($oPhp5);
print_r($oConstr);
print_r($oEncap);
$oConstr->__destruct();
print_r($oConstr);
18. • Exercitando
– Crie a seguinte classe com nome Funcionario e a manipule através
de um arquivochamado appFuncionario.php.
– Diagrama de classe:
Orientação a Objetos
13/02/2011 18
19. • Herança - Conceitos
– Como no mundo real, em orientação a objetos a palavra herança sugere
a construção de uma classe com base em outra já existente.
– Ou seja, a criação de uma nova classe que herda as características,
propriedades e comportamentos de uma classe base.
– Tal conceito é conhecido também como Generalização.
– Herança permite que a classe filha usufrua das propriedades e
comportamentos da classe pai, assim como a alteração de tais
comportamentos e a criação de novas propriedades e atributos
específicos.
Orientação a Objetos
13/02/2011 19
20. • Herança no PHP
– Em PHP uma classe pode herdar propriedades e métodos de outra classe
usando a palavra-chave extends na sua declaração.
– Não é possível herdar classes múltiplas, uma classe só pode herdar uma
classe base (ou classe pai, ou ainda classe genérica).
– Para acessar atributos e métodos da classe pai, utiliza-se a palavra
reservada parent seguida de dois pontos duplos (::).
Orientação a Objetos
13/02/2011 20
21. • Herança no PHP
– Vejamos o diagrama ao lado.
– A classe Dependentes estende a classe
Funcionario, aplicando o conceito de
generalização (herança).
– A classe Dependentes herda as
propriedades e atributos da classe
Funcionario.
Orientação a Objetos
13/02/2011 21
Diagrama de Classe
22. • Herança no PHP
– Código fonte:
Orientação a Objetos
13/02/2011 22
<?php
class Dependentes extends Funcionario
{
private $dependentes = array();
public function __construct($dependentes)
{
}
public function imprimeDadosFuncionario()
{
}
}
23. • Herança no PHP
– Exemplo: Implementação prática.
Orientação a Objetos
13/02/2011 23
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 />';
}
}
}
24. • Herança no PHP
– Exemplo: … continuação da Implementação prática.
Orientação a Objetos
13/02/2011 24
// appFuncDependentes.php
require_once './class/Funcionario.php';
require_once './class/Dependentes.php';
$dependentes = array('Maria', 'Pedro', 'Lucas');
$funcionario = new Dependentes($dependentes);
$funcionario->setMatricula('777');
$funcionario->setNome('George');
$funcionario->setRg('1234567');
$funcionario->setDepartamento('Informática');
echo 'Ficha do funcionário: ';
$funcionario->imprimeDadosFuncionario();
Saída:
Ficha do funcionário: Matrícula: 777
Nome: George
RG: 1234567
Departamento: Informática
Dependentes:
- Maria
- Pedro
- Lucas
25. • Conversão da classe para string
– Impressão da classe:
– Erro:
– Correção deste problema convertento para string:
– Resultado:
Orientação a Objetos
13/02/2011 25
Saída:
Catchable fatal error: Object of class Funcionario could not be converted to string in C:...
// appToString.php
$funcionario = new Funcionario();
echo $funcionario;
// Classe Funcionario.php
public function __toString(){
return 'Classe Funcionario';
}
Saída:
Classe Funcionario
26. • 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.
Orientação a Objetos
13/02/2011 26
// appReferenciaObjeto.php
$funcionario = new Funcionario();
$novoFuncionario = $funcionario;
$funcionario->setDepartamento('RH');
echo "A matrícula do funcionário é: {$novoFuncionario->getDepartamento()}";
Saída:
A matrícula do funcionário é: RH
27. • 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.
Orientação a Objetos
13/02/2011 27
// 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
A matrícula do funcionário é:
28. • Atributos e Métodos Estáticos
– Declarar atributos ou métodos de uma classe
como estáticos faz deles acessíveis sem precisar
de instanciar a classe.
– A palavra reservada STATIC é utilizada na declaração de
atributos e métodos estáticos.
Orientação a Objetos
13/02/2011 28
29. • Atributos e Métodos Estáticos
– A referência aos atributos estáticos da classe é feita através da
palavra reservada self seguida de dois pontos duplos (::) em vez de
“$this->”.
– Um atributo declarado como estático não pode ser acessado com
um objeto instanciado da classe (embora métodos estáticos
podem).
Orientação a Objetos
13/02/2011 29
30. • Atributos e Métodos Estáticos
Orientação a Objetos
13/02/2011 30
// Classe Matematica
class Matematica
{
public static function soma( $a, $b )
{
return $a + $b;
}
}
// appMatematica.php
$num1 = 4;
$num2 = 5;
echo Matematica::soma($num1, $num2);
echo '<br />';
echo Matematica::subtracao($num1, $num2);
echo '<br />';
echo Matematica::multiplicacao($num1, $num2);
echo '<br />';
echo Matematica::divisao($num1, $num2);
Saída:
9
-1
20
0.8
Diagrama de Classe
31. • 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.
Orientação a Objetos
13/02/2011 31
Diagrama de Classe
32. • 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.
Orientação a Objetos
13/02/2011 32
Diagrama de Classe
33. • Overloading (Sobrecarga)
– Provê meios dinâmicos para manipular atributos
(propriedades) e métodos em PHP.
– Utilizados na manipulação de métodos e propriedades não
declarados explicitamente ou não visíveis no escopo atual.
– Todos os métodos sobrecarregados devem ser definidos
como públicos.
– Este procedimento é feito através dos métodos mágicos.
Orientação a Objetos
13/02/2011 33
34. • Overloading (Sobrecarga)
– Sobrecarga de atributos:
• __set () : executado para a atribuição de valores em propriedades
inacessíveis.
• __get () : utilizada para retornar valores de propriedades inacessíveis.
• __isset () : acionado para chamar isset () ou empty () em propriedades
inacessíveis (PHP 5.1.0).
• __unset () : invocado para chamar unset () é em propriedades
inacessíveis (PHP 5.1.0).
Orientação a Objetos
13/02/2011 34
35. • Overloading (Sobrecarga)
– Sobrecarga de métodos:
• __call () : acionado ao invocar métodos inacessíveis em um contexto
de objeto.
• __callStatic() : acionado ao invocar métodos estáticos inacessíveis em
um contexto de objeto (PHP 5.3.0).
Orientação a Objetos
13/02/2011 35
36. • Overloading (Sobrecarga)
– Sobrecarregando os
atributos da classe
Funcionario dos
exemplos anteriores:
Orientação a Objetos
13/02/2011 36
// FuncionarioOverloading.php
class FuncionarioOverloading
{
private $matricula = null;
private $nome = null;
private $rg = null;
protected $departamento = null;
public function __construct( ) { }
public function __get( $atributo )
{
return $this->$atributo;
}
public function __set( $atributo, $valor)
{
$this->$atributo = $valor;
}
}
37. • Overloading (Sobrecarga)
– Sobrecarregando os atributos da classe Funcionario dos
exemplos anteriores:
Orientação a Objetos
13/02/2011 37
// appFuncOver.php
$funcionario = new FuncionarioOverloading();
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);
echo "<br/><strong>Dados do funcionário</strong><br />
- Matrícula: {$funcionario->__get('matricula')}
- Nome: {$funcionario->__get('nome')}
- RG: {$funcionario->__get('rg')}
- Departamento: {$funcionario->__get('departamento')}";
38. • Overloading (Sobrecarga)
– Sobrecarregando os atributos da classe Funcionario dos
exemplos anteriores:
Orientação a Objetos
13/02/2011 38
Saída:
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
- RG: 1234567
- Departamento: Informática
39. • Iteração de Objetos
– PHP 5 fornece uma maneira de definir objetos para que seja
possível iterar atributos públicos de uma classe, como uma
lista de itens.
– Por padrão, todas as propriedades visíveis (públicas) serão
usadas para a iteração.
– Essa iteração é efetualda facilmente com a estrutura de
controle foreach.
Orientação a Objetos
13/02/2011 39
40. • Iteração de Objetos
Orientação a Objetos
13/02/2011 40
Class Iteracao
{
public $nome = "George";
public $casado = true;
public $idade = 28;
}
Saída:
nome : George
casado : 1
idade : 28
// appIteracaoObjetos.php
$objeto = new Iteracao();
foreach ($objeto as $atributo => $valor)
{
print "$atributo : $valor <br />";
}
Atributo da classeObjeto da classe Valor do atributo
Diagrama de Classe
41. • Indução de Tipo
– PHP 5 implementa indução de tipo.
– Neste conceito, funções e métodos podem forçar que
parâmetros devem ser um objeto de uma classe.
– Basta especificar o nome da classe no desenvolvimento da
função ou método.
– É possível também aplicar em arrays (PHP 5.1).
Orientação a Objetos
13/02/2011 41
42. • Indução de Tipo
Orientação a Objetos
13/02/2011 42
Class Aves // Classe Aves.php
{
public $galinha = "có có có!";
public $pato = "quá quá quá!";
}
Saída:
Galinha: có có có!
Pato: quá quá quá!
Assados: Hummmm!
Class AssarAves // Classe AssarAves.php
{
public $assados = "Hummmm!";
function cardapio( Aves $cardapio)
{
echo "Galinha: $cardapio->galinha<br />
Pato: $cardapio->pato<br />
Assados: $this->assados";
}
}
$aves = new Aves(); // appAves.php
$assarAves = new AssarAves();
$assarAves->cardapio($aves);
43. • Reflection API
– Permite realizar a engenharia reversa de diversos elementos
em PHP5.
– É uma poderosa funcionalidade que nos permite obter
informações e metadados de classes, objetos, funções, etc.
Orientação a Objetos
13/02/2011 43
44. • Reflection API
Orientação a Objetos
13/02/2011 44
// appReflexao.php
$refClasslIter = new ReflectionClass('IteracaoObjetos');
$refClasslFunc = new ReflectionClass('Funcionario');
echo '<strong>Propriedades da classe IteracaoObjetos:</strong> <br />';
foreach ($refClasslIter->getProperties() as $value)
{
echo $value.'<br />';
}
echo '<br /><strong>Dados da classe Funcionario:</strong> <br />';
echo "Nome da classe: {$refClasslFunc->getName()} <br />";
echo "Arquivo: {$refClasslFunc->getFileName()} <br />";
Saída:
Propriedades da classe IteracaoObjetos:
Property [ public $nome ]
Property [ public $casado ]
Property [ public $idade ]
Dados da classe Funcionario:
Nome da classe: Funcionario
Arquivo: C:Program FilesZendApache2htdocsphp5.3-objetosclassFuncionario.php
45. • Late Static Bindings (PHP 5.3)
– Permite referenciar uma classe chamada no contexto de
herança estática.
– Para tanto a palavra reservada static:: é utilizada na chamada
de um método estático, mas não somente para métodos.
Orientação a Objetos
13/02/2011 45
46. • 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.
– Late Static Bingings
• Resolve tal limitação através da palavra reservada static:: em vez de
self::, referenciando a classe chamada em tempo de execução em vez
da classe que a define.
Orientação a Objetos
13/02/2011 46
47. • Late Static Bindings (PHP 5.3)
– Exemplo
• Vamos implememtar o exemplo seguinte criando as classes em um
mesmo arquivo para facilitar:
– LateStaticBindings.php (classe)
• E para testar vamos implementar o arquivo:
– appLateStaticBindings.php
• Vejamos a implementação a seguir:
Orientação a Objetos
13/02/2011 47
48. • Late Static Bindings (PHP 5.3)
Orientação a Objetos
13/02/2011 48
49. • Late Static Bindings (PHP 5.3)
Orientação a Objetos
13/02/2011 49
class X // LateStaticBindings.php
{
public static function imprimeClasse()
{
echo 'Eu sou a classe '.__CLASS__;
}
public static function chamaClasse()
{
self::imprimeClasse();
}
}
class TesteX extends X
{
public static function imprimeClasse()
{
echo 'Eu sou a classe '.__CLASS__;
}
}
Saída:
Eu sou a classe X
// appLateStaticBindings.php
TesteX::chamaClasse();
50. • Late Static Bindings (PHP 5.3)
Orientação a Objetos
13/02/2011 50
51. • Late Static Bindings (PHP 5.3)
Orientação a Objetos
13/02/2011 51
class Y // LateStaticBindings.php
{
public static function imprimeClasse()
{
echo 'Eu sou a classe '.__CLASS__;
}
public static function chamaClasse()
{
static::imprimeClasse();
}
}
class TesteY extends Y
{
public static function imprimeClasse()
{
echo 'Eu sou a classe '.__CLASS__;
}
}
Saída:
Eu sou a classe X
Eu sou a classe TesteY
// appLateStaticBindings.php
TesteX::chamaClasse();
echo '<br />';
TesteY::chamaClasse();
52. • Autoload – Carregando classes automaticamente
– Normalmente ao desenvolver aplicações orientadas a objeto
em PHP os desenvolvedores criam um arquivo para cada
definição de classe.
– Consequentemente uma lista de includes é necessária para a
inclusão de cada classe em uso. No o PHP5 isso não é mais
necessário.
Orientação a Objetos
13/02/2011 52
53. • 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.
– Esta função é chamada automaticamente.
Orientação a Objetos
13/02/2011 53
54. • Autoload – Carregando classes automaticamente
– Implementação básica:
– Exemplo testando as classes Funcionario, Matematica e Util
já implementadas:
Orientação a Objetos
13/02/2011 54
function __autoload( $classe )
{
require_once "{$classe}.php";
}
require_once './func/autoload.php'; // appAutoloadClasses.php
$funcionario = new Funcionario;
echo $funcionario;
echo '<br />';
echo Matematica::multiplicacao(4, 4);
echo '<br />';
Util::printR($funcionario, __FILE__, __LINE__);
56. • 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/…
Como resolver este problema? Pesquise, implemente e entregue na
próxima aula.
Orientação a Objetos
13/02/2011 56
57. • Constantes do Objeto
– É possível definir valores constantes em cada classe,
permanecendo os mesmos e imutáveis.
– Constantes diferem de variáveis no não uso do símbolo $ para
declará-las ou utilizá-las. Mas utilizando a palavra reservada
CONST na declaração.
– Assim como os atributos estáticos são referenciadas ou
chamadas através da palavra reservada self do PHP.
Orientação a Objetos
13/02/2011 57
58. • Constantes do Objeto
– Como os atributos estáticos (static), valores constantes não
podem ser acessados a partir de uma instância de um
objeto (como por exemplo $object::constante).
– O valor deve ser uma expressão constante, não podendo ser
(por exemplo) uma variável, um atributo de uma classe, o
resultado de uma operação matemática ou uma chamada de
função.
Orientação a Objetos
13/02/2011 58
59. • Constantes do Objeto
– Classe de constantes:
Orientação a Objetos
13/02/2011 59
// 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 ";
}
61. • 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.
– Qualquer classe que contêm pelo menos um método abstrato deve
também ser abstrata.
– Métodos definidos como abstratos simplesmente declaram a
assinatura do método, eles não podem definir a implementação.
Orientação a Objetos
13/02/2011 61
62. • 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.
– Além disso, esses métodos devem ser definidos com a mesma
visibilidade ou mais fraca.
– Por exemplo, se um método abstrado é definido como protected, a
implementação do método deve ser definida como protected ou
public.
Orientação a Objetos
13/02/2011 62
63. • Classes e Métodos Abstratos
– Exemplo 01 - Classe Abstrata Venda
Orientação a Objetos
13/02/2011 63
// Classe Abstrata Venda.php
abstract class Venda
{
private $valor = 0.0;
private $desconto = 0.0;
public function __set($atributo, $valor)
{
$this->$atributo = $valor;
}
public function __get($atributo)
{
return $this->$atributo;
}
}
64. • Classes e Métodos Abstratos
– Exemplo 01 - Classe Orcamento (herda a classe Venda)
Orientação a Objetos
13/02/2011 64
// Classe Orcamento.php
class Orcamento extends Venda
{
private $taxa = array('cheque' => 1.10, 'cartao' => 1.18 );
public function vendaVista()
{
return $this->__get('valor') - $this->desconto;
}
public function vendaCheque()
{
return ($this->__get('valor')*$this->taxa['cheque']) - $this->desconto;
}
public function vendaCartao()
{
return $this->__get('valor')*$this->taxa['cartao'] - $this->desconto;
}
}
69. • Interfaces
– Interfaces de Objetos permitem a criação de código que especifica
quais métodos e variáveis uma classe deve implementar, sem ter
que definir como esses métodos serão tratados.
– A Interface é um contrato da classe. Interfaces são definidas
usando a palavra-chave 'interface', da mesma maneira que uma
classe comum, mas sem nenhum dos métodos ter seu conteúdo
definido.
Orientação a Objetos
13/02/2011 69
70. • 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.
– Todos os métodos na interface devem ser implementados na classe; não
fazer isso resultará em um erro fatal.
– Classes podem implementar mais de uma interface se assim for
desejado, separando cada interface com uma vírgula.
Orientação a Objetos
13/02/2011 70
Nota: Uma classe não pode implementar duas interfaces que compartilham
o mesmo nome uma vez que isso causaria ambiguidade.
71. • Interfaces
– Exemplo 01 - Interface OperacoesMatematicas
Orientação a Objetos
13/02/2011 71
// Interface IOperacoesMatematicas.php
interface IOperacoesMatematicas
{
public static function soma($x, $y);
public static function subtracao($x, $y);
public static function multiplicacao($x, $y);
public static function divisao($x, $y);
public static function imprimeOperacoes($x, $y);
}
72. • Interfaces
– Exemplo 01 – Classe OpMatematicas que implementa a interface
OperacoesMatematicas
Orientação a Objetos
13/02/2011 72
// 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 />";
}
}
74. • Polimorfismo
– É a capacidade de dois ou mais objetos de diferentes classes
responderem à mesma mensagem de diferentes maneiras. Ou
seja, é um recurso que possibilita que objetos diferentes sejam
tratados por uma interface única.
– O Polimorfismo se define então na implementação de diversos
comportamentos em diferentes classes, que se relacionam
através de uma única Interface ou Superclasse.
Orientação a Objetos
13/02/2011 74
75. • Polimorfismo
Orientação a Objetos
13/02/2011 75
interface IAnuncioImobiliaria // IAnuncioImobiliaria.php
{
public static function imprimeDados();
}
class Anuncio1 implements IAnuncioImobiliaria
{ // Anuncio1.php
private static $dados = 'Casa, 2 quartos, sala, cozinha,
R. 37, Qd. 32, JD Oriente, Cuiabá-MT;';
public static function imprimeDados() {echo self::$dados; }
}
class Anuncio2 implements IAnuncioImobiliaria
{// Anuncio2.php
public static $dados = 'AP, 3 quartos, sala, cozinha, 2 garagens,
R. Barão Franca, Qd. 02, Rodovalho, Goiânia-GO;';
public static function imprimeDados() {echo self::$dados; }
}
class Anuncio3 implements IAnuncioImobiliaria // Anuncio3.php
{
public static $dados = 'Sobrado, 5 quartos, 2 salas,
2 cozinhas, 3 garagens, SEPN, Qd. 205, Brasília-DF';
public static function imprimeDados() {echo self::$dados; }
}
77. • 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.
– Podemos implementar um código PHP em um bloco try, para
facilitar a captura de exceções em potencial.
– Cada bloco try, deve ter pelo menos um bloco catch
correspondente.
Orientação a Objetos
13/02/2011 77
78. • 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.
Orientação a Objetos
13/02/2011 78
79. • 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.
Orientação a Objetos
13/02/2011 79
80. • Exceções
– Criando uma classe de Exceção para uma classe
Orientação a Objetos
13/02/2011 80
// 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!');
}
}
}
81. • Exceções
– Criando uma aplicação para disparar a Exceção
Orientação a Objetos
13/02/2011 81
// 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:
Mensagem: Erro - Divisão por zero!
Linha: 8
Arquivo: D:ZendApache2htdocsphp5.3-objetosclassDivisao.php
Codigo: 0
82. • Simple XML
– O SimpleXML provê um conjunto de ferramentas muito fácil e
simples de usar para converter XML em objetos que podem
ser processados normalmente com seletores de propriedades
e iteradores de arrays.
– A extensão SimpleXML requer PHP 5.
– A extensão SimpleXML é habilitada por padrão.
Orientação a Objetos
13/02/2011 82
83. • Simple XML
– Criando o arquivo XML
Orientação a Objetos
13/02/2011 83
// 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>
84. • Simple XML
– Criando uma aplicação com a extensão
Orientação a Objetos
13/02/2011 84
// 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
Titulo: Zend Framework in Action
Autor: Rob Allen
85. • Padrões de Projeto
– Os padrões de projeto de software ou padrões de desenho de
software, também muito conhecido pelo termo original em
inglês Design Patterns, descrevem soluções para problemas
recorrentes no desenvolvimento de sistemas de software
orientados a objetos.
Orientação a Objetos
13/02/2011 85
86. • Padrões de Projeto
– Objetivos
• Reutilização de código
• Melhores práticas de programação
• Solução para problemas do dia a dia
Orientação a Objetos
13/02/2011 86
87. • 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.
• Este padrão é utilizado consequentemente em implementações que
necessitam de classes que disponibilizam apenas uma instância do
objeto na aplicação.
Orientação a Objetos
13/02/2011 87
88. • Singleton
– Criando a classe
Orientação a Objetos
13/02/2011 88
// Classe Singleton.php
class Singleton
{
// instancia da classe
private static $objDaClasse = null;
private function __construct() { /* ... */ }
public static function getObjDaClasse()
{
if (self::$objDaClasse === null)
{
self::$objDaClasse = new Singleton();
}
return self::$objDaClasse;
}
}
89. • Singleton
– Criando uma aplicação para testar o objeto Singleton
Orientação a Objetos
13/02/2011 89
// appSingleton.php
$o1 = Singleton::getObjDaClasse();
$o2 = Singleton::getObjDaClasse();
$o3 = Singleton::getObjDaClasse();
echo '<pre>';
var_dump($o1);
var_dump($o2);
var_dump($o3);
Apenas um objeto
daclasse é criado em
memória
Saída:
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}
object(Singleton)#1 (0) {
}