89
Bacharel em Ciência da Computação (UFG) Especializando em Engenharia de Software Analista de Sistemas – SIGMA / MDIC Professor Formador EAD – NEAD/ETEB [email protected] http://www.georgemendonca.com.br Orientação a Objetos

PHP 5.3 - Classes e Objetos

Embed Size (px)

DESCRIPTION

Orientação a Objetos em PHP.

Citation preview

Page 1: PHP 5.3 - Classes e Objetos

Bacharel em Ciência da Computação (UFG) Especializando em Engenharia de Software

Analista de Sistemas – SIGMA / MDIC

Professor Formador EAD – NEAD/ETEB [email protected]

http://www.georgemendonca.com.br

Orientação a Objetos

Page 2: PHP 5.3 - Classes e 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

Page 3: PHP 5.3 - Classes e Objetos

• 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

Page 4: PHP 5.3 - Classes e Objetos

• 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

Page 5: PHP 5.3 - Classes e Objetos

• 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

Page 6: PHP 5.3 - Classes e Objetos

• 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

Page 7: PHP 5.3 - Classes e 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.

– 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

Page 8: PHP 5.3 - Classes e Objetos

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

}

...

}

Page 9: PHP 5.3 - Classes e 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.

– 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

Page 10: PHP 5.3 - Classes e Objetos

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

}

...

}

Page 11: PHP 5.3 - Classes e Objetos

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

Page 12: PHP 5.3 - Classes e Objetos

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

Page 13: PHP 5.3 - Classes e 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

– 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

Page 14: PHP 5.3 - Classes e Objetos

• 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

Page 15: PHP 5.3 - Classes e Objetos

• 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

Page 16: PHP 5.3 - Classes e Objetos

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

Page 17: PHP 5.3 - Classes e Objetos

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

Page 18: PHP 5.3 - Classes e Objetos

• 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

Page 19: PHP 5.3 - Classes e Objetos

• 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

Page 20: PHP 5.3 - Classes e Objetos

• 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

Page 21: PHP 5.3 - Classes e Objetos

• 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

Page 22: PHP 5.3 - Classes e Objetos

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

{

}

}

Page 23: PHP 5.3 - Classes e Objetos

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

}

}

}

Page 24: PHP 5.3 - Classes e Objetos

• 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

Page 25: PHP 5.3 - Classes e Objetos

• 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

Page 26: PHP 5.3 - Classes e 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.

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

Page 27: PHP 5.3 - Classes e 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.

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

Page 28: PHP 5.3 - Classes e Objetos

• 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

Page 29: PHP 5.3 - Classes e Objetos

• 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

Page 30: PHP 5.3 - Classes e Objetos

• 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

Page 31: PHP 5.3 - Classes e 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.

Orientação a Objetos

13/02/2011 31

Diagrama de Classe

Page 32: PHP 5.3 - Classes e 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.

Orientação a Objetos

13/02/2011 32

Diagrama de Classe

Page 33: PHP 5.3 - Classes e Objetos

• 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

Page 34: PHP 5.3 - Classes e Objetos

• 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

Page 35: PHP 5.3 - Classes e Objetos

• 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

Page 36: PHP 5.3 - Classes e Objetos

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

}

}

Page 37: PHP 5.3 - Classes e Objetos

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

Page 38: PHP 5.3 - Classes e Objetos

• 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

Page 39: PHP 5.3 - Classes e Objetos

• 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

Page 40: PHP 5.3 - Classes e Objetos

• 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

Page 41: PHP 5.3 - Classes e Objetos

• 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

Page 42: PHP 5.3 - Classes e Objetos

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

Page 43: PHP 5.3 - Classes e Objetos

• 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

Page 44: PHP 5.3 - Classes e Objetos

• 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

Page 45: PHP 5.3 - Classes e Objetos

• 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

Page 46: PHP 5.3 - Classes e 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.

– 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

Page 47: PHP 5.3 - Classes e Objetos

• 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

Page 48: PHP 5.3 - Classes e Objetos

• Late Static Bindings (PHP 5.3)

Orientação a Objetos

13/02/2011 48

Page 49: PHP 5.3 - Classes e Objetos

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

Page 50: PHP 5.3 - Classes e Objetos

• Late Static Bindings (PHP 5.3)

Orientação a Objetos

13/02/2011 50

Page 51: PHP 5.3 - Classes e Objetos

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

Page 52: PHP 5.3 - Classes e Objetos

• 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

Page 53: PHP 5.3 - Classes e 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.

– Esta função é chamada automaticamente.

Orientação a Objetos

13/02/2011 53

Page 54: PHP 5.3 - Classes e Objetos

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

Page 55: PHP 5.3 - Classes e Objetos

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

Page 56: PHP 5.3 - Classes e 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/… Como resolver este problema? Pesquise, implemente e entregue na próxima aula.

Orientação a Objetos

13/02/2011 56

Page 57: PHP 5.3 - Classes e Objetos

• 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

Page 58: PHP 5.3 - Classes e Objetos

• 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

Page 59: PHP 5.3 - Classes e Objetos

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

}

Page 60: PHP 5.3 - Classes e Objetos

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

Page 61: PHP 5.3 - Classes e 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.

– 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

Page 62: PHP 5.3 - Classes e 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.

– 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

Page 63: PHP 5.3 - Classes e Objetos

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

}

}

Page 64: PHP 5.3 - Classes e Objetos

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

}

}

Page 65: PHP 5.3 - Classes e Objetos

• 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

Page 66: PHP 5.3 - Classes e Objetos

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

}

Page 67: PHP 5.3 - Classes e Objetos

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

}

...

}

Page 68: PHP 5.3 - Classes e Objetos

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

Page 69: PHP 5.3 - Classes e Objetos

• 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

Page 70: PHP 5.3 - Classes e 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.

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

Page 71: PHP 5.3 - Classes e Objetos

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

}

Page 72: PHP 5.3 - Classes e Objetos

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

}

}

Page 73: PHP 5.3 - Classes e Objetos

• 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

Page 74: PHP 5.3 - Classes e Objetos

• 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

Page 75: PHP 5.3 - Classes e Objetos

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

}

Page 76: PHP 5.3 - Classes e Objetos

• 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

Page 77: PHP 5.3 - Classes e 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.

– 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

Page 78: PHP 5.3 - Classes e 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.

Orientação a Objetos

13/02/2011 78

Page 79: PHP 5.3 - Classes e 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.

Orientação a Objetos

13/02/2011 79

Page 80: PHP 5.3 - Classes e Objetos

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

}

}

}

Page 81: PHP 5.3 - Classes e Objetos

• 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

Page 82: PHP 5.3 - Classes e Objetos

• 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

Page 83: PHP 5.3 - Classes e Objetos

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

Page 84: PHP 5.3 - Classes e Objetos

• 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

Page 85: PHP 5.3 - Classes e Objetos

• 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

Page 86: PHP 5.3 - Classes e Objetos

• 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

Page 87: PHP 5.3 - Classes e 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.

• 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

Page 88: PHP 5.3 - Classes e Objetos

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

}

}

Page 89: PHP 5.3 - Classes e Objetos

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