Orientação a Objetos em PHP

2,692 views
2,577 views

Published on

Apresentação do básico de OO em PHP no 2º Workshop do PHPMS

Published in: Technology
2 Comments
6 Likes
Statistics
Notes
  • Valdirene, slide arrumado :) Valeu!
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Tem um erro na página 14. A propriedade $cor está sim publica, a propriedade $raça (colocaram com cedilha) que está privada
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,692
On SlideShare
0
From Embeds
0
Number of Embeds
52
Actions
Shares
0
Downloads
0
Comments
2
Likes
6
Embeds 0
No embeds

No notes for slide

Orientação a Objetos em PHP

  1. 1. Orientação a Objetos em PHP Grupo de Usuários de PHP de Mato Grosso do Sul 03/10/09 – José Ricardo da Silva- 2º Workshop do PHPMS - Senac – Campo Grande/MS - Brasil
  2. 2. Conteúdo abordado ✔ Introdução à OO ✔ Definição de classes e instanciação de objetos ✔ Palavras-chave e operadores relativos à OO em PHP ✔ Herança ✔ Interfaces ✔ Conclusões ✔ Perguntas
  3. 3. Intro ✔ Olhe a sua volta. O que você vê? ✔ Objetos reais possuem duas características ✔ Estado ✔ Comportamento ✔ Cachorros ✔ Nome, cor, raça, estão com fome, estão felizes, etc ✔ Latem, buscam coisas, balançam o rabo
  4. 4. Objetos ✔ Objetos podem ser muito simples ✔ Uma lamparina ✔ Estados: acesa ou apagada ✔ Comportamento: pode ser ligada e desligada ✔ Ou muito complexos ✔ Vários estados e vários comportamentos ✔ Podem conter outros objetos ✔ Interagem com outros objetos ✔ Herdam propriedades e comportamentos de outros objetos
  5. 5. Objetos em software
  6. 6. Objetos em software
  7. 7. Objetos em software ✔ O estado é armazenado em variáveis ✔ E o comportamento é definido através de métodos
  8. 8. Classes ✔ Templates de objetos ✔ Definem estado ✔ Atributos ✔ De objetos e da própria classe ✔ E comportamento ✔ Métodos ✔ De objetos e da própria clase ✔ Palavra-chave: class e new ✔ Novidades: $this e ->
  9. 9. class Cachorro { var $nome; var $cor; var $raca; var $estaComFome = false; var $estaFeliz = true; } $meuCachorro = new Cachorro(); $meuCachorro -> nome = “bidu”; $meuCachorro -> cor = “marrom”; $meuCachorro -> raca = “vira-latas”;
  10. 10. Objeto ✔ Uma instância de uma classe ✔ Armazena dados ✔ Ocupa espaço na memória Animal CachorroSubclasse Objeto
  11. 11. class Cachorro { var $nome; var $cor; var $raca; var $estaComFome = false; var $estaFeliz = true; } $meuCachorro = new Cachorro(); $meuCachorro -> nome = “bidu”; $meuCachorro -> cor = “marrom”; $meuCachorro -> raca = “vira-latas”; PHP 4? WTF?
  12. 12. Visibilidade ✔ Introduzidas no PHP5 ✔ public ✔ private ✔ protected
  13. 13. class Cachorro { public $nome; private $cor; private $raca; var $estaComFome = false; var $estaFeliz = true; } $meuCachorro = new Cachorro(); $meuCachorro -> nome = “bidu”; $meuCachorro -> cor = “marrom”;
  14. 14. class Cachorro { public $nome; private $cor; private $raça; private $estaComFome = false; private $estaFeliz = true; } $meuCachorro = new Cachorro(); $meuCachorro -> nome = “bidu”; $meuCachorro -> cor = “marrom”; Fatal error: Cannot access private property Cachorro::$cor in ...
  15. 15. Encapsulamento ✔ Princípio fundamental de OO ✔ Esconder o estado de um objeto ✔ Troca de estado → Invocação de método Lembram?
  16. 16. class Cachorro { private $raca; private $estaComFome = true; private $estaFeliz = false; private $racas = array('vira-latas', 'pastor alemão', 'pitbull'); public function definaRaca($raca) { if (in_array($raca, $this -> racas)) $this -> raca = $raca; } public function comer() { $estaComFome = false; $estaFeliz = true; } } $meuCachorro = new Cachorro(); $meuCachorro -> definaRaca('pitbull'); $meuCachorro -> comer();
  17. 17. class Cachorro { public $racas = array('vira-latas', 'pastor alemão', 'pitbull'); public function definaRaca($raca) { … } ... } $meuCachorro = new Cachorro(); $meuCachorro -> definaRaca($meuCachorro -> racas[1]); echo $meuCachorro -> racas[2]; new SplMaxHeap();
  18. 18. Encapsulamento - Benefícios ✔ O estado é o que diferencia um objeto de outro ✔ Inclusive de um objeto inválido ✔ Mantém-se o controle sobre como o “mundo” manipula o objeto ✔ Cachorro de cor “livro” ou de raça “abacate”? ✔ Assume-se que o método funciona ✔ “Como” não é importante, é? ✔ Pressupostos sobre o funcionamento podem trazer problemas ✔ Manipulação externa de estado → dor de cabeça
  19. 19. Atributos e Métodos de Classe ✔ Sem instanciação de objeto ✔ Palavra-chave: static ✔ Default: public
  20. 20. class Cachorro { private $nome; private $cor; private $raça; private $estaComFome = false; private $estaFeliz = true; static $racas = array('vira-latas', 'pastor alemão', 'pitbull'); }
  21. 21. class Cachorro { private $nome; private $cor; private $raça; private $estaComFome = false; private $estaFeliz = true; private static $racas = array('vira-latas', 'pastor alemão', 'pitbull'); }
  22. 22. Static ✔ Nos métodos ✔ Sai a $this ✔ Entra a self ✔ No acesso ✔ Sai o -> ✔ Entra o operador de resolução de escopo ✔::
  23. 23. class Cachorro { private $nome; private $cor; private $raça; private $estaComFome = false; private $estaFeliz = true; private static $racas = array('vira-latas', 'pastor alemão', 'pitbull'); public static $patas = 2; public function definaRaca($raca) { if (in_array($raca, self::$racas)) $this -> raca = $raca; } } $cachorro = new Cachorro(); $cachorro -> definaRaca('pitbull'); echo 'Cachorros têm: ' . Cachorro::$patas . 'patas';
  24. 24. class Cachorro { ... private static $racas = array('vira-latas', 'pastor alemão', 'pitbull'); public function definaRaca($raca) { if (in_array($raca, self::$racas)) $this -> raca = $raca; } public static function imprimaRacas() { // $this? nem pensar foreach(self::$racas as $raca) echo $raca . “n”; } } Cachorro::imprimaRacas();
  25. 25. Constantes de classe ✔ É possível definir também valores constantes a uma classe ✔ Palavra-chave: const
  26. 26. class Cachorro { private $nome; private $cor; private $raca; private $estaComFome = false; private $estaFeliz = true; const patas = 2; // sem cifrão } echo 'Cachorros têm: ' . Cachorro::patas . ' patas';
  27. 27. Herança ✔ No mundo real é comum encontrarmos objetos com características em comum Veiculo Carro Moto Bicicleta Avião $velocidade acelerar() freiar() $cor
  28. 28. Herança ✔ Hierarquia de classes ✔ Uma super-classe é uma generalização de uma ou mais subclasses ✔ Subclasses ✔ Herdam os atributos e os métodos de suas super-classes ✔ Podem definir novos atributos e métodos ✔ Mecanismo de reuso ✔ Aumenta a complexidade
  29. 29. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); $this -> pubFunction(); } } $obj = new Base(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função publica chamada
  30. 30. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); $this -> pubFunction(); } } $obj = new Base(); $obj -> varProtegida = 'novo valor'; $obj -> outraFuncao();
  31. 31. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); $this -> pubFunction(); } } $obj = new Base(); echo $obj -> varProtegida; $obj -> outraFuncao();
  32. 32. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); $this -> pubFunction(); } } $obj = new Base(); $obj -> proFunction(); $obj -> outraFuncao();
  33. 33. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { } $obj = new Classe1(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função publica chamada
  34. 34. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { } $obj = new Classe1(); $obj -> outraFuncao(); class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { public function pubFunction() { echo "Função {$this -> varPublica} da classe filha chamadan"; } } $obj = new Classe1(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função publica da classe filha chamada
  35. 35. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { public function pubFunction() { echo "Função {$this -> varProtegida} da classe filha chamadan"; } } $obj = new Classe1(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função protegida da classe filha chamada
  36. 36. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { public function pubFunction() { echo "Função {$this -> varPrivada} da classe filha chamadan"; } } $obj = new Classe1(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função da classe filha chamada
  37. 37. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { public function pubFunction() { $this -> proFunction(); } } $obj = new Classe1(); $obj -> outraFuncao(); Função privada chamada Função protegida chamada Função protegida chamada
  38. 38. class Base { private $varPrivada = 'privada'; protected $varProtegida = 'protegida'; public $varPublica = 'publica'; private function priFunction() { echo "Função {$this -> varPrivada} chamadan"; } protected function proFunction() { echo "Função {$this -> varProtegida} chamadan"; } public function pubFunction() { echo "Função {$this -> varPublica} chamadan"; } public function outraFuncao() { $this -> priFunction(); $this -> proFunction(); this -> pubFunction(); } } class Classe1 extends Base { public function pubFunction() { $this -> priFunction(); } } $obj = new Classe1(); $obj -> outraFuncao(); Fatal Error!
  39. 39. abstract class Veiculo { protected $velocidade; abstract public function acelerar($qtde); } abstract class VeiculoMotorizado extends Veiculo { protected $nivelDoTanque; public function nivelDoTanque() { return $this -> nivelDoTanque; } } class Moto extends VeiculoMotorizado { public function gireAcelerador($qtde) { … } public function acelerar($qtde) { $this -> velocidade += $this -> gireAcelerador($qtde); } } class Carro extends VeiculoMotorizado { public function piseAcelerador($qtde) { ... } public function acelerar($qtde) { $this -> velocidade += $this -> piseAcelerador($qtde); } } $obj = new Carro(); $obj -> acelerar(2); echo $obj -> nivelDoTanque();
  40. 40. Interfaces ✔ Um contrato ✔ Especificam quais métodos uma classe deve implementar ✔ Não definem como os métodos devem ser implementados ✔ São definidas de maneira similar à definição de classes ✔ Palavras-chave: interface e implements ✔ Métodos sem corpo ✔ Todos os métodos são públicos
  41. 41. interface Bicicleta { public function mudarDirecao($valor); public function acelerar($incremento); public function freiar($decremento); } class Trek implements Bicicleta { public function mudarDirecao($valor) {…} public function acelerar($incremento) { // trocando de marcha $this -> trocaMarcha($this -> marcha - 1); // acelerando... } public function freiar($decremento) { … } } class BarraForte implements Bicicleta { public function mudarDirecao($valor) {…} public function acelerar($incremento) { … } public function freiar($decremento) { // colocando o pé no chão $decremento vezes $this -> coloqueOPeNoChao($decremento); } }
  42. 42. interface Produto { public function definirPreco($valor); public function obterPreco($valor); } interface Veiculo { public function mudarDirecao($valor); public function acelerar($incremento); public function freiar($decremento); } interface Bicicleta extends Veiculo { public function empinar($grau); } interface BicicletaComMarchas extends Bicicleta, Produto { public function trocarMarcha($incOuDec); }
  43. 43. class Caloi implements BicicletaComMarchas { public function definirPreco($valor) { // … } public function obterPreco($valor) { … } public function mudarDirecao($valor) { … } public function acelerar($incremento) { … } public function freiar($decremento) { … } public function empinar($grau) { … } public function trocarMarcha($incOuDec) { … } }
  44. 44. interface Bicicleta { const TIPO = “terrestre”; public function mudarDirecao($valor); public function acelerar($incremento); public function freiar($decremento); } class BarraForte implements Bicicleta { const TIPO = “anfíbio”; public function mudarDirecao($valor) {…} public function acelerar($incremento) { … } public function freiar($decremento) { // colocando o pé no chão $decremento vezes $this -> coloqueOPeNoChao($decremento); } }
  45. 45. interface Produto { public function comprar(); public function definirNome($nome); public function vender(); } interface Objeto { public function girar($direcao); public function definirNome($nome); public function remover(); } interface Bicicleta extends Objeto, Produto { } ?
  46. 46. Final ✔ Introduzida no PHP5 ✔ Previne que classes filhas sobrescrevam um método ✔ Previne que classes sejam extendidas ✔ Não se aplica a propriedades
  47. 47. class Base { public function test() { echo "test() foi invocada"; } final public function maisTestes() { echo "Mais testes"; } } class Filha extends Base { public function maisTestes() { echo "oh-oh"; } }
  48. 48. final class Base { ... } class Filha extends Base { }
  49. 49. Conclusões ✔ Construção de software a partir de objetos que interagem entre si ✔ Cada um é responsável pela ✔ Manutenção de seu estado ✔ Execução de suas operações ✔ Maior manutenibilidade ✔ Objetos são entidades que encapsulam funcionalidades ✔ Componentes reusáveis ✔ Se um objeto “quebra”, troque-o ✔ Mapeamento entidades do mundo real → objetos do sistema
  50. 50. About Site: http://www.josericardo.eti.br   E-mail: contato@josericardo.eti.br   Twitter: http://www.twitter.com/zehzinho Alguma dúvida? :)  
  51. 51. Referências ✔ http://www.php.net/manual ✔ http://www.php.net/manual/en/language.oop5.php ✔ http://www.slideshare.net/sudarsun/object-oriented-design ✔ http://java.sun.com/docs/books/tutorial/java/concepts/index.html

×