PHP 5.3 - Classes e Objetos

Preview:

DESCRIPTION

Orientação a Objetos em PHP.

Citation preview

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

• 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

• 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

• 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

• 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

• 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

• 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

• 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]

}

...

}

• 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

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

}

...

}

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

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

• 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

• 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

• 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

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

• Instanciando o objeto da classe

Orientação a Objetos

13/02/2011 17

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] => [atributoPrivado:Encapsulamento:private] => )

• 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

• 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

• 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

• 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

• 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()

{

}

}

• 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 />';

}

}

}

• 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

• 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

• 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

• 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 é:

• 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

• 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

• 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

• 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

• 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

• 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

• 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

• 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

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

}

}

• 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')}";

• 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

• 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

• 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 classe Objeto da classe Valor do atributo

Diagrama de Classe

• 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

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

• 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

• 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 Files\Zend\Apache2\htdocs\php5.3-objetos\class\Funcionario.php

• 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

• 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

• 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

• Late Static Bindings (PHP 5.3)

Orientação a Objetos

13/02/2011 48

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

• Late Static Bindings (PHP 5.3)

Orientação a Objetos

13/02/2011 50

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

• 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

• 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

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

• Autoload – Carregando classes automaticamente

Orientação a Objetos

13/02/2011 55

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] => )

• 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

• 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

• 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

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

}

• Constantes do Objeto

– Implementação básica:

Orientação a Objetos

13/02/2011 60

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

• 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

• 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

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

}

}

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

}

}

• Classes e Métodos Abstratos

– Exemplo 01 – Testando as classes de Venda

Orientação a Objetos

13/02/2011 65

// appVenda.php

$venda = new Orcamento();

$venda->__set('valor', 90);

$venda->__set('desconto', 10);

echo "<strong> === Orcamento === </strong><br /><br />";

echo "Preco: {$venda->__get('valor')}<br />";

echo "Desconto: {$venda->__get('desconto')}<br />";

echo "A vista: {$venda->vendaVista()}<br />";

echo "Cheque: {$venda->vendaCheque()}<br />";

echo "Cartao: {$venda->vendaCartao()}<br />";

Saída:

=== Orçamento === Preço: 90 Desconto: 10 À vista: 80 Cheque: 89 Cartão: 96.2

• Classes e Métodos Abstratos

– Exemplo 02 – Adição do método abstrato imprimeOrcamento

Orientação a Objetos

13/02/2011 66

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

}

abstract function imprimeOrcamento($valor, $desconto);

}

• Classes e Métodos Abstratos

– Exemplo 02 – Adição do método abstrato imprimeOrcamento

Orientação a Objetos

13/02/2011 67

// Classe Orcamento.php

class Orcamento extends Venda

{

...

public function imprimeOrcamento($valor, $desconto)

{

$this->__set('valor', $valor);

$this->__set('desconto', $desconto);

echo "<strong> === Orcamento === </strong><br /><br />";

echo "Preco: {$this->__get('valor')}<br />";

echo "Desconto: {$this->__get('desconto')}<br />";

echo "A vista: {$this->vendaVista()}<br />";

echo "Cheque: {$this->vendaCheque()}<br />";

echo "Cartao: {$this->vendaCartao()}<br /><br />";

}

...

}

• Classes e Métodos Abstratos

– Exemplo 02 – Adição do método abstrato imprimeOrcamento

Orientação a Objetos

13/02/2011 68

// appVenda.php

$a = Util::httpRequest('a');

$b = Util::httpRequest('b');

if(!empty($a) and !empty($b))

{

$venda = new Orcamento();

$venda->imprimeOrcamento($a, $b);

echo "<button onclick=\"window.location='appVenda.php'\">

>> Refazer Orçamento

</button>";

}

else

{?>

<form method="post">

Valor <input type="text" name="a" /> <br />

Desconto <input type="text" name="b"> <br />

<input type="submit" value=" >> Gerar Orçamento " />

</form>

<?php

}

Saída:

• 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

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

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

}

• 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 />";

}

}

• Interfaces

– Exemplo 01 – Aplicação appOpMatematicas

Orientação a Objetos

13/02/2011 73

// appOpMatematicas.php

$a = Util::httpRequest('a');

$b = Util::httpRequest('b');

if(!empty($a) and !empty($b))

{

OpMatematicas::imprimeOperacoes($a, $b);

}

else

{

?>

<form method="post">

1º Número: <input type="text" name="a" /> <br />

2º Número: <input type="text" name="b" /> <br />

<input type="submit" value=" >> Calcular " />

</form>

<?php

}

Saída:

As operacoes matemáticas entre 7 e 9 são: Soma: 16 Subtracao: -2 Multiplicacao: 63 Divisao: 0.77777777777778

• 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

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

}

• Polimorfismo

Orientação a Objetos

13/02/2011 76

// 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: Casa, 2 quartos, sala, cozinha, R. 37, Qd. 32, JD Oriente, Cuiabá-MT; AP, 3 quartos, sala, cozinha, 2 garagens, R. Barão Franca, Qd. 02, Rodovalho, Goiânia-GO; Sobrado, 5 quartos, 2 salas, 2 cozinhas, 3 garagens, SEPN, Qd. 205, Brasília-DF

• 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

• 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

• 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

• 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!');

}

}

}

• 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:\Zend\Apache2\htdocs\php5.3-objetos\class\Divisao.php Codigo: 0

• 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

• 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>

• 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

• 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

• 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

• 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

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

}

}

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