Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)

11,505 views

Published on

Oficina:
Uma abordagem prática de Orientação a Objetos com PHP no FLISOL DF 2011.

Published in: Technology
1 Comment
17 Likes
Statistics
Notes
No Downloads
Views
Total views
11,505
On SlideShare
0
From Embeds
0
Number of Embeds
1,258
Actions
Shares
0
Downloads
288
Comments
1
Likes
17
Embeds 0
No embeds

No notes for slide

Uma Abordagem Prática de Orientação a Objetos com PHP (FLISOL DF 2011)

  1. 1. Uma abordagem prática deOrientação a Objetos com PHP george@georgemendonca.com.br http://www.georgemendonca.com.br
  2. 2. Orientação a Objetos• Introdução – Versão atual: PHP 5.3 - http://www.php.net/releases. • 5.3.0 (30/06/2009) • 5.3.1 (19/11/2009) • 5.3.2 (04/04/2010) • 5.3.3 (22/07/2010) • 5.3.4 (09/12/2010) • 5.3.5 (06/01/2011) • 5.3.6 (17/03/2011) 2
  3. 3. Orientação a Objetos• Introdução – Possui suporte a OO desde a versão 3. – A versão 4 foi reescrita com o objetivo de tornar mais rápida e estável. – No PHP 5 foi desenvolvido um novo modelo de objetos, completamente reescrito, mais completo, permitindo uma performance melhor e mais vantagens. 3
  4. 4. Orientação a 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 4
  5. 5. Orientação a Objetos• Introdução – Diferenças entre o PHP 4 e o PHP 5 Diagrama de Classe <?php Class Php4 { /** * Atributos simples */ var $a; var $b; var $c; /** * Método construtor da classe PHP 4 * Métodos simples */ function Php4() { } } 5
  6. 6. Orientação a Objetos• Introdução – Diferenças entre o PHP 4 e o PHP 5 • PHP 5 - Classes mais completas e uso de padrões: – Com implementação de recursos semelhantes às linguagens de programação como C++ e Java. 6
  7. 7. Orientação a Objetos• Introdução – Diferenças entre o PHP 4 e o PHP 5 Diagrama de Classe <?php Class Php5 { /** * Visibilidade de atributos (encapsulamento) */ public $a; protected $b; private $c; /** * Método construtor da classe PHP 5 * Visibilidade de métodos */ public function __construct() { } } 7
  8. 8. Orientação a Objetos• Escrevendo uma classe – A definição de uma classe em PHP 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 (ou comportamentos) da classe. 8
  9. 9. Orientação a Objetos• Escrevendo uma classe <?php class Nome_da_Classe { encapsulamento $atributo1; ... 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
  10. 10. Orientação a Objetos• A variável $this – Uma pseudo variável $this está disponível quando um método da classe é chamado dentro de um contexto de objeto. – Sua implementação normalmente se encontra dentro do escopo de um método. – $this é uma referência para o objeto ao chamar um método ou um atributo. 10
  11. 11. Orientação a Objetos• A variável $this <?php Class Nome_da_Classe { encapsulamento $atributo1; ... encapsulamento function nome_metodo() { // A variável $this referencia o objeto // chamado em tempo de execução no script. return $this->atributo1; } ... } 11
  12. 12. Orientação a Objetos• A variável $this – Observação importante para o entendimento: • Há uma certa dificuldade em entender a utilização desta variável em uma classe em qualquer linguagem de programação. Então: » Imagine uma classe como a planta de uma casa. » Cada casa construída é um objeto desta planta, porém cada um com sua implementação específica (local, alterações, material, etc.). » Relacionando, a variável $this referencia cada objeto criado desta classe (cada casa construída com base nesta planta). ;D 12
  13. 13. Orientação a Objetos• Encapsulamento de atributos e métodos – O encapsulamento (ou visibilidade) de um atributo ou de um método pode ser definido prefixando a declaração com as palavras-chave: • public, protected e 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. 13
  14. 14. Orientação a Objetos• Encapsulamento de atributos e métodos Diagrama de Classe <?php 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 } } 14
  15. 15. Orientação a 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 necessite no momento em que é instanciado. 15
  16. 16. Orientação a Objetos• Construtores e Destrutores <?phpDiagrama de Classe Class ConstrutorDestrutor O construtor da classe { inicializa os valores dos private $a; atributos do objeto caso private $b; necessário. public function __construct($a, $b) { $this->a = $a; $this->b = $b; } public function __destruct() { $this->a = null; Libera o espaço em $this->b = null; memória reservado para o objeto no encerramento } do script ou quando } chamado explicitamente. 16
  17. 17. Orientação a 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). 17
  18. 18. Orientação a Objetos• Instanciando o objeto da classe – Editor utilizado: Eclipse (Eclipse for PHP Developers) – Estrutura de pasta proposta para os exemplos: – Boas práticas: • Criar uma classe por arquivo e nomear arquivo com o nome da classe – Ex.: MinhaClasse.php • Tipificar as variáveis PHP na nomenclatura da variável – Ex.: $aCidades [ ] = $oCidade (array de cidades recebe objeto cidade) • Utilize caminho relativo na inclusão de arquivos – "./pasta/arquivo.php" • Se tiver somente código PHP não feche a tag PHP (porque?) 18
  19. 19. Orientação a Objetos• Instanciando o objeto da classe <?php require_once ./class/php4.php; require_once ./class/php5.php; require_once ./class/Encapsulamento.php; require_once ./class/ConstrutorDestrutor.php; $oPhp4 = new Php4(); $oPhp5 = new Php5(); $oEncap = new Encapsulamento(); $oConstr = new ConstrutorDestrutor(1, 2); echo "<pre>"; print_r($oPhp4); print_r($oPhp5); print_r($oEncap); print_r($oConstr); $oConstr->__destruct(); print_r($oConstr); 19
  20. 20. Orientação a Objetos• Instanciando o objeto da classe Saída: Php4 Object ( [a] => [b] => [c] => ) Php5 Object ( [a:Php5:private] => [b:Php5:private] => [c:Php5:private] => ) Encapsulamento Object ( [atributoPublico] => [atributoProtegido:protected] => [atributoPrivado:Encapsulamento:private] => ) 20
  21. 21. Orientação a Objetos• Exercitando Diagrama de Classe – Crie a classe ao lado, seus atributos e métodos e a manipule através de um arquivo com o nome appFuncionario.php. 21
  22. 22. Orientação a 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 (ou classe pai) . 22
  23. 23. Orientação a Objetos• Herança - Conceitos – Tal conceito é conhecido também como Generalização. – Herança permite que a classe filha usufrua das propriedades e comportamentos da classe pai (exceto privados), assim como a alteração de tais comportamentos e a criação de novas propriedades e atributos específicos. 23
  24. 24. Orientação a 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 (::). 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. 24
  25. 25. Orientação a Objetos• Herança no PHP Diagrama de Classe – Vejamos o diagrama ao lado. – A classe Dependentes (classe filha) estende a classe Funcionario (último exercício), aplicando o conceito de generalização (herança). – A classe Dependentes herda as propriedades e atributos da classe Funcionario (classe pai). 25
  26. 26. Orientação a Objetos• Herança no PHP – Implementando o diagrama de classe: <?php class Dependentes extends Funcionario { private $dependentes = array(); public function __construct($dependentes) { // Implementações de inicialização do objeto } public function imprimeDadosFuncionario() { // Impressão dos dados do Funcionário } } 26
  27. 27. Orientação a Objetos• Herança no PHP – Exemplo: Implementação prática. <?php class Dependentes extends Funcionario { private $dependentes = array(); public function __construct( $dependentes ) { $this->dependentes = $dependentes; } public function imprimeDadosFuncionario() { echo "<b>Matrícula</b>: {$this->getMatricula()} <br /> <b>Nome</b>: {$this->getNome()} <br /> <b>RG</b>: {$this->getRg()} <br /> <b>Departamento</b>: {$this->getDepartamento()} <br /> <b>Dependentes</b>: <br />"; foreach ($this->dependentes as $value) { echo " - {$value}<br />"; } } } 27
  28. 28. Orientação a Objetos • Herança no PHP – Exemplo: Implementação prática (continuação).<?php Saída:// appFuncDependentes.phprequire_once ./class/Funcionario.php; Ficha do funcionário: Matrícula: 777require_once ./class/Dependentes.php; Nome: George//Exercício sobre Herança (Generalização)$aDpendentes = array(Maria, Pedro, Lucas); RG: 1234567# Instanciando o objeto e passando o array de dependentes Departamento: Informática$oDependentes = new Dependentes( $aDpendentes ); Dependentes:# Setando os dados do funcionário - Maria$oDependentes->setMatricula(777); - Pedro$oDependentes->setNome(George); - Lucas$oDependentes->setRg(1234567);$oDependentes->setDepartamento(Informática);# Imprimindo dados dos dependentesecho <strong>Dados dos dependentes</strong>: <br />;$oDependentes->imprimeDadosFuncionario(); 28
  29. 29. Orientação a Objetos• Conversão da classe para string – Impressão da classe: <?php // appToString.php require_once ./class/Funcionario.php; $oFuncionario = new Funcionario(); echo $oFuncionario; – Erro: Saída: Catchable fatal error: Object of class Funcionario could not be converted to string in varwww... – Correção deste problema convertento para string: // Adicionar à classe Funcionario (Funcionario.php) public function __toString(){ return Classe Funcionario; } – Resultado: Saída: Classe Funcionario 29
  30. 30. Orientação a Objetos• Referência do objeto – Sempre que uma variável do tipo objeto é atribuída a uma outra variável, ele recebe somente a referência deste objeto. – Tais variáveis referenciam exatamente o mesmo objeto.<?phprequire_once ./class/Funcionario.php;$oFuncionario = new Funcionario(); Departamento inserido$oNovoFuncionario = $oFuncionario; no primeiro objeto O segundo objeto também contém o$oFuncionario->setDepartamento(RH); Departamento inseridoecho "A matrícula do funcionário é: {$oNovoFuncionario->getDepartamento()}"; Saída: A matrícula do funcionário é: RH 30
  31. 31. Orientação a Objetos• Clonagem de Objetos – Necessário quando precisamos clonar um objeto, criando outro espaço em memória ao invés de uma referência. – Neste caso é criada uma nova instância do objeto, contendo as mesmas propriedades e métodos. <?php // appClonagemObjeto.php Um novo objeto é require_once ./class/Funcionario.php; criado através da clonagem do primeiro. $oFuncionario = new Funcionario(); $oNovoFuncionario = clone $oFuncionario; $oFuncionario->setDepartamento(RH); $oNovoFuncionario->setDepartamento(Informática); echo "Departamento: {$oFuncionario->getDepartamento()} <br />"; echo "Departamento: {$oNovoFuncionario->getDepartamento()}"; Saída: Departamento: RH 31 Departamento: Informática
  32. 32. Orientação a 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. 32
  33. 33. Orientação a 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). 33
  34. 34. Orientação a Objetos• Atributos e Métodos Estáticos Diagrama de Classe <?php // Classe Matematica class Matematica { public static function soma( $a, $b ) { return $a + $b; } } <?php // appMatematica.php $num1 = 4; $num2 = 5; echo Matematica::soma($num1, $num2); Saída: 9 34
  35. 35. Orientação a 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. 35
  36. 36. Orientação a 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). 36
  37. 37. Orientação a 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). 37
  38. 38. Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando <?php // FuncionarioOverloading.php class FuncionarioOverloading os atributos da { private $matricula = null; private $nome = null; classe Funcionario private $rg = null; protected $departamento = null; dos exemplos public function __construct( ) { } anteriores: public function __get( $atributo ) { return $this->$atributo; } public function __set( $atributo, $valor) { $this->$atributo = $valor; } } 38
  39. 39. Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando os atributos da classe Funcionario dos exemplos anteriores: <?php // appSobrecarga.php require_once ./class/FuncionarioOverloading.php; $oFuncionario = new FuncionarioOverloading(); echo "<pre>"; print_r($oFuncionario); $oFuncionario->__set(matricula,777); $oFuncionario->__set(nome,George Mendonça); $oFuncionario->__set(rg,1234567); $oFuncionario->__set(departamento,Informática); echo "<pre>"; print_r($oFuncionario); echo "<br/><strong>Dados do funcionário</strong><br /> - Matrícula: {$oFuncionario->__get(matricula)} - Nome: {$oFuncionario->__get(nome)} - RG: {$oFuncionario->__get(rg)} - Departamento: {$oFuncionario->__get(departamento)}"; 39
  40. 40. Orientação a Objetos• Overloading (Sobrecarga) – Sobrecarregando os atributos da classe Funcionario dos exemplos anteriores: 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 40 - Departamento: Informática
  41. 41. Orientação a 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. 41
  42. 42. Orientação a Objetos• Iteração de Objetos Diagrama de Classe <?php Class Iteracao { public $nome = "George"; public $casado = true; public $idade = 28; } <?php // appIteracaoObjetos.php Saída: require_once ./class/IteracaoObjetos.php; nome : George $oIteracao = new IteracaoObjetos(); casado : 1 idade : 28 foreach ($oIteracao as $atributo => $valor) { print "$atributo : $valor <br />"; } Objeto da classe Atributo da classe Valor do atributo 42
  43. 43. Orientação a Objetos• Indução de Tipo – PHP 5 implementa indução de tipo. – Neste conceito, funções e métodos podem forçar parâmetros a serem objetos 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). 43
  44. 44. Orientação a Objetos• Indução de Tipo Class Aves // Classe Aves.php { public $galinha = "có có có!"; public $pato = "quá quá quá!"; } Class AssarAves // Classe AssarAves.php { public $assados = "Hummmm!"; function cardapio( Aves $cardapio) { echo "Galinha: $cardapio->galinha<br /> Saída: Pato: $cardapio->pato<br /> Assados: $this->assados"; Galinha: có có có! } Pato: quá quá quá! } Assados: Hummmm! $oAves = new Aves(); $oAssarAves = new AssarAves(); $oAssarAves->cardapio($oAves); 44
  45. 45. Orientação a 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. 45
  46. 46. Orientação a Objetos• Reflection API <?php // appReflexao.php require_once ./class/IteracaoObjetos.php; require_once ./class/FuncionarioOverloading.php; $oRefClasslIter = new ReflectionClass(IteracaoObjetos); $oRefClasslFunc = new ReflectionClass(FuncionarioOverloading); echo <strong>Propriedades da classe IteracaoObjetos:</strong> <br />; foreach ($oRefClasslIter->getProperties() as $value) { echo $value.<br />; } echo <br /><strong>Dados da classe Funcionario:</strong> <br />; echo "Nome da classe: {$oRefClasslFunc->getName()} <br />"; echo "Arquivo: {$oRefClasslFunc->getFileName()} <br />"; 46
  47. 47. Orientação a Objetos• Reflection API Saída: Propriedades da classe IteracaoObjetos: Property [ public $nome ] Property [ public $casado ] Property [ public $idade ] Dados da classe Funcionario: Nome da classe: Funcionario Arquivo: /var/www/php5.3-objetos/10-reflexao/class/FuncionarioOverloading.php 47
  48. 48. Orientação a 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. 48
  49. 49. Orientação a Objetos• Autoload – Carregando classes automaticamente – Com a função __autoload quando você tentar usar uma classe/interface que ainda não foi definida, o script engine tem uma última chance para carregar a classe antes que o PHP aponte o erro. – Esta função é chamada automaticamente. 49
  50. 50. Orientação a Objetos• Autoload – Carregando classes automaticamente – Implementação a função autoload: <?php function __autoload( $classe ) { require_once "./class/{$classe}.php"; } – Testando as classes Funcionario e Matematica: <?php // appAutoloadClasses.php require_once ./func/autoload.php; $oFuncionario = new Funcionario; echo $oFuncionario.<br />; echo Matematica::multiplicacao(4, 4).<br />; echo "<pre>"; print_r($oFuncionario); 50
  51. 51. Orientação a Objetos• Autoload – Carregando classes automaticamente Saída: Classe Funcionario 16 Funcionario Object ( [matricula:Funcionario:private] => [nome:Funcionario:private] => [rg:Funcionario:private] => [departamento:protected] => ) 51
  52. 52. Orientação a 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. 52
  53. 53. Orientação a Objetos• Late Static Bindings (PHP 5.3) – Limitação do self:: • Em um contexto de herança, por exemplo, referências estáticas são resolvidas usando a classe na qual foi definida, ou seja, a qual pertence. Mas não na classe a qual foi chamada em tempo de execução. – 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. 53
  54. 54. Orientação a 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: 54
  55. 55. Orientação a Objetos• Late Static Bindings (PHP 5.3) 55
  56. 56. Orientação a Objetos • Late Static Bindings (PHP 5.3)<?php <?php // appLateStaticBindings.phpclass X // X.php require_once ./func/autoload.php;{ public static function imprimeClasse() TesteX::chamaClasse(); { echo Eu sou a classe .__CLASS__; } public static function chamaClasse() Saída: { self::imprimeClasse(); Eu sou a classe X }}class TesteX extends X // TesteX.php { public static function imprimeClasse() { echo Eu sou a classe .__CLASS__; }} 56
  57. 57. Orientação a Objetos• Late Static Bindings (PHP 5.3) 57
  58. 58. Orientação a Objetos • Late Static Bindings (PHP 5.3)<?php <?php // appLateStaticBindings.phpclass Y // Y.php require_once ./func/autoload.php; { public static function imprimeClasse() TesteX::chamaClasse(); { echo <br />; echo Eu sou a classe .__CLASS__; TesteY::chamaClasse(); } public static function chamaClasse() { Saída: static::imprimeClasse(); } Eu sou a classe X} Eu sou a classe TesteYclass TesteY extends Y // TesteY.php { public static function imprimeClasse() { echo Eu sou a classe .__CLASS__; }} 58
  59. 59. Orientação a 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. 59
  60. 60. Orientação a 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. 60
  61. 61. Orientação a Objetos• Constantes do Objeto – Classe de constantes: // 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
  62. 62. Orientação a Objetos• Constantes do Objeto Saída: – Implementação básica:<?php // appConstantesdaClasse.phprequire_once ./func/autoload.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>"; 62
  63. 63. Orientação a Objetos• Classes e Métodos Abstratos – PHP 5 introduz métodos e classes abstratos. – Não é permitido criar uma instância de uma classe que foi definida como abstrata. – 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. 63
  64. 64. Orientação a Objetos• Classes e Métodos Abstratos – Quando uma classe herda uma classe abstrata, todos os métodos marcados como abstratos na declaração da classe pai devem ser definidos na classe filha. – 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. 64
  65. 65. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 - Classe Abstrata Venda <?php // 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; } } 65
  66. 66. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 - Classe Orcamento <?php // 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; } } 66
  67. 67. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 01 – Calculando o orçamento <?php // appOrcamento.php require_once ./func/autoload.php; $oOrcamento = new Orcamento(); Saída: $oOrcamento->__set(valor, 90); === Orçamento === $oOrcamento->__set(desconto, 10); echo "<strong> === Orcamento === </strong><br /><br />"; Preço: 90 echo "Preço: {$oOrcamento->__get(valor)}<br />"; Desconto: 10 echo "Desconto: {$oOrcamento->__get(desconto)}<br />"; À vista: 80 echo "À vista: {$oOrcamento->vendaVista()}<br />"; Cheque: 89 echo "Cheque: {$oOrcamento->vendaCheque()}<br />"; Cartão: 96.2 echo "Cartão: {$oOrcamento->vendaCartao()}<br />"; 67
  68. 68. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Método abstrato imprimeOrcamento // 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); } 68
  69. 69. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Adição do método abstrato imprimeOrcamento // 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 "Preço: {$this->__get(valor)}<br />"; echo "Desconto: {$this->__get(desconto)}<br />"; echo "À vista: {$this->vendaVista()}<br />"; echo "Cheque: {$this->vendaCheque()}<br />"; echo "Cartão: {$this->vendaCartao()}<br /><br />"; } ... } 69
  70. 70. Orientação a Objetos• Classes e Métodos Abstratos – Exemplo 02 – Adição do método abstrato imprimeOrcamento Saída: <?php // appVendaMetodoAbstrato.php === Orçamento === require_once ./func/autoload.php; $oOrcamento = new Orcamento(); Preço: 90 Desconto: 10 $oOrcamento->imprimeOrcamento(90, 10); À vista: 80 Cheque: 89 Cartão: 96.2 70
  71. 71. Orientação a 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. 71
  72. 72. Orientação a Objetos• Interfaces – Todos os métodos declarados em uma interface devem ser public, essa é a natureza de uma interface. Para implementar uma interface, o operador implements é usado. – 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. Nota: Uma classe não pode implementar duas interfaces que compartilham o mesmo nome uma vez que isso causaria ambiguidade. 72
  73. 73. Orientação a Objetos• Interfaces – Exemplo 01 - Interface OperacoesMatematicas <?php //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); } 73
  74. 74. Orientação a Objetos• Interfaces – Exemplo 01 – Classe OpMatematicas que implementa a interface OperacoesMatematicas <?php // OpMatematicas.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 : Divsão 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
  75. 75. Orientação a Objetos • Interfaces – Exemplo 01 – Aplicação appOpMatematicas<?php // appOpMatematicas.phprequire_once ./func/autoload.php;if(isset($_POST[a]) and isset($_POST[b])){ $a = $_POST[a]; Saída: $b = $_POST[b]; OpMatematicas::imprimeOperacoes($a, $b); As operacoes matemáticas entre 7 e 9 são:} Soma: 16else Subtracao: -2{ Multiplicacao: 63 ?> Divisao: 0.77777777777778 <form method="post" id="operacoes"> 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} 75
  76. 76. Orientação a 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. 76
  77. 77. Orientação a Objetos• Polimorfismo 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
  78. 78. Orientação a Objetos• Polimorfismo <?php // appAnuncios.php require_once ./func/autoload.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. 78
  79. 79. Orientação a Objetos• Exceções – PHP 5 tem um modelo de exceção é similar ao de outras linguagens de programação. Uma exceção pode ser disparada (thrown), ou pega (caught ou "catched") no PHP. – 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. 79
  80. 80. Orientação a Objetos• Exceções – Vários blocos catch podem ser usados para pegar diferentes classes de exceções. – A execução normal (quando nenhuma exceção é disparada dentro de um bloco try ou quando um catch compatível com a classe da exceção disparada não estiver presente) continuará após o último bloco catch definido na sequência. – Exceções podem ser disparadas (ou re-disparadas) dentro de um bloco catch. 80
  81. 81. Orientação a Objetos• Exceções – Quando uma exceção é disparada, o código logo após à instrução não será executada, e o PHP tentará achar o primeiro bloco catch correspondente à exceção disparada. 81
  82. 82. Orientação a Objetos• Exceções – Criando uma classe de Exceção para uma classe // DivisaoException.php class DivisaoException extends Exception {} // Divisao.php class Divisao { public function __construct($a, $b) { if ($b == 0) { throw new DivisaoException(Erro - Divisão por zero!); } } } 82
  83. 83. Orientação a Objetos• Exceções – Criando uma aplicação para disparar a Exceção <?php require_once ./func/autoload.php; try { $oDivisao = 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: /var/www/php5.3-objetos/17-excecoes/class/Divisao.php Codigo: 0 83
  84. 84. 84
  85. 85. Até o próximo FLISOL! 85

×