PHP 5.3 - Classes e Objetos

16,140 views

Published on

Orientação a Objetos em PHP.

Published in: Education, Technology

PHP 5.3 - Classes e Objetos

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

×