Your SlideShare is downloading. ×
Traits no PHP 5.4: muito além da herança
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Traits no PHP 5.4: muito além da herança

1,379
views

Published on

Esta palestra mostra como traits resolvem um problema relativo à limitação do reuso por herança em orientação a objetos e como são …

Esta palestra mostra como traits resolvem um problema relativo à limitação do reuso por herança em orientação a objetos e como são
implementados no PHP 5.4.


1 Comment
7 Likes
Statistics
Notes
No Downloads
Views
Total Views
1,379
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
22
Comments
1
Likes
7
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Traits no PHP 5.4: muito além da herança Flávio Gomes da Silva Lisboawww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 2. Quem sou eu AutorArquiteto e Desenvolvedor Certificado Instrutor www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 3. Consultorwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 4. Consultorwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 5. Consultorwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 6. Especialista em história em quadrinhos http://perse.doneit.com.br romocavaleirodoespaco.blogspot.comwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 7. Não se preocupe, esta apresentação não fala do Lanterna Verdewww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 8. Não seria maravilhoso se existisse uma maneira de criar um software de modo que quando precisássemos alterá-lo, pudéssemos fazer isso com o menor impacto possível no código existente? Poderíamos perder menos tempo retrabalhando o código e mais tempo para permitir que o programa faça coisas mais legais...www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 9. Tudo começou aqui European Conference on Object-Oriented Programmingwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 10. Princípio de Design“Identifique os aspectos de seu aplicativo quevariam e separe-os do que permanece igual”. Eric e Elisabeth Freeman www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 11. ResumoEsta palestra mostra como traits resolvem umproblema relativo à limitação do reuso porherança em orientação a objetos e como sãoimplementados no PHP 5.4. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 12. PaperTraits: “unidades de comportamento que podem compor algo” Schärli, Ducasse, Nierstraz e Black www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 13. Fato: “A herança é o mecanismo de reuso fundamental nas linguagens de programação orientadas a objetos”www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 14. Fato: “Todas as variantes de herança sofrem de problemas conceituais e práticos”www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 15. Fato: “A herança é um mecanismo com muitos significados e interpretações conflitantes”www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 16. A programação de computadores seapropria de termos de outras áreasde conhecimento fazendo analogias www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 17. Seria a herança genética?www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 18. Na herança genética, cada filho recebe uma combinação decaracterísticas do pai e da mãe... e isso é naturalmente probabilístico www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 19. combinação probabilísticowww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 20. combinação probabilísticowww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 21. Existem dois tipos de herança na programação orientada a objetos● Simples: uma classe herda TODAS as características herdáveis de outra● Múltipla: uma classe herda TODAS as características herdáveis de mais de uma classe. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 22. Esses dois tipos são determinísticos● Em ambos os tipos, existe uma forma de dizer o que será ou não herdado, que é o escopo de visibilidade de atributos e métodos. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 23. A herança em orientação a objetos seria um testamento? www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 24. Mas esta não é a herança simples da orientação a objetoswww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 25. Nem estawww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 26. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 27. Esta não é a herança da orientação a objetoswww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 28. O problema com a analogia dotestamento, é que nesse caso cadaherdeiro leva uma parte daherança.E não é isso que acontece com aorientação a objetos, na qual a cadaclasse filha leva toda a herança. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 29. A herança simples daorientação a objetos, então, é esta: www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 30. Na herança simples, várias classespodem reutilizar atributos e métodos de uma classe ancestral.Mas o reuso não é pleno, já que, por herdar deapenas uma classe, você pode acabar “copiando”atributos e métodos de outra classe, gerandocódigo duplicado.E o código duplicado é mutante: você não temum controle fácil sobre implementações. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 31. Herança simples e código duplicado www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 32. Nem pense nisso! Criar dependências implica em diminuir a flexibilidadewww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 33. Na arquitetura do software énecessário encontrar um ponto deequilíbrio entre instabilidade eabstração www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 34. E a herança múltipla? Animal Cavalo Pássaro Pégasowww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 35. Seria isto? Animalwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 36. Seria isto? Animal NÃO!www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 37. Seria mais parecido com isso: Animalwww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 38. “A herança múltipla é boa, mas não há um bom modo de fazê-la” Steve CookA herança múltipla permitiria combinar atributose métodos de várias classes em uma novaclasse.Mas existem vários problemas decorrentes daherança múltipla... por isso PHP não aimplementa. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 39. Ah, mas eu posso usar interfaces...Sim, mas interfaces não temimplementação. O problema nãoé padronizar a comunicação,mas reutilizar código. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 40. Problema do Diamantewww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 41. Problema do DiamanteConflito de nomes:Se existem atributosou métodoscom nomes iguais,mas contextos diferentes,qual deve ser herdado?www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 42. Problema do DiamanteImplementação:Se um método de umaclasse ancestral forsobrescrito pelas classesherdadas, qualimplementação seráusada?www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 43. Herança múltipla não é genética...Herança múltipla traz tudo de todos os pais.E nem sempre (talvez na maioria dos casos)queremos combinar tudo de todos, mas algumascoisas de todos.Não queremos gerar um clone (até porque não dápra gerar um clone de mais de um original) masuma combinação de traços (atributos e métodos). www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 44. Composição de classes é um paliativoVocê pode contornar a inexistência de herançamúltipla fazendo com que uma classe contenhaoutra, em vez de estendê-la.Com essa abordagem, uma classe podeartificialmente herdar tanto atributos quantométodos de múltiplas classes.Mas persiste o problema de que é tudo ou nada. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 45. Composição de classes é um paliativo<?phpnamespace DCComicsCharacters;class Amazo{ private $decorators = array(); public function __construct() { $this->decorators[] = new Superman(); $this->decorators[] = new MartianManhunter(); }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 46. Composição de classes é um paliativowww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 47. Composição de classes é um paliativowww.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 48. Paradoxo da Herança de ClassesUma classe tem um papel primário de geradorade instâncias, logo ela deve ser completa.Mas como unidade de reuso, uma classe deveser pequena, com a menor implementaçãopossível.Isso é contraditório! www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 49. Separação de papéisSe a classe deve ser a geradora de instâncias,alguém tem de assumir o papel de unidade dereuso. É aí que entram os traits.Traits são unidades primitivas de reuso de código. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 50. Traits►Um trait provê um conjunto de métodos queimplementam comportamento.►Classes e traits podem ser compostos por outros traits.►Métodos conflitantes devem ser explicitamenteresolvidos.►A composição com traits não afeta a semântica daclasse. É como se os métodos fossem declarados nela. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 51. Classes e Verbos►Herança de classe: Ser►Composição de classe: Ter (ter é melhor que ser)►Traits: Usar (usar é melhor que ter) www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 52. Declarando um trait em PHP trait GenericTrait { public function doSomeSingle() { echo something single; } }Traits não podem ser instanciados, apenas usados! www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 53. Usando um trait em PHP class ClassC { use SpecialTrait; }Se uma classe herda um método que tem omesmo nome de um método contido em um trait, otrait sobrescreve o método herdado.Tesoura corta papel. Trait corta classe mãe. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 54. Usando vários traits em PHPclass Amazo{ use Aquaman, Flash;} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 55. Sobrescrevendo um trait em PHP class ClassB { use GenericTrait; public function doSomeSingle() { echo Something single in fact; } }O método da classe tem precedência sobre o trait! www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 56. Resolução de conflitostrait Fifer{ public function buildHouse() { echo building a strawhouse; }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 57. Resolução de conflitostrait Fiddler{ public function buildHouse() { echo building a stickhouse; }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 58. Resolução de conflitostrait Practical{ public function buildHouse() { echo building a brickhouse; }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 59. Resolução de conflitosclass PerfectPig{ use Fifer, Fiddler, Practical;} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 60. Resolução de conflitosclass PerfectPig{ use Fifer, Fiddler, Practical { Practical::buildHouse insteadofFifer, Fiddler; }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 61. Resolução de conflitosclass PerfectPig{ use Fifer, Fiddler, Practical { Practical::buildHouse insteadofFifer, Fiddler; Fifer::buildHouse as buildShitHouse; }} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 62. Trait > (Interface + Implementação)● Uma classe não pode implementar duas interfaces que tenham métodos com mesmo nome.● Interfaces não suportam atributos, apenas constantes.● Os métodos de uma interface tem de ser públicos. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 63. Traits suportam atributos● Você pode definir atributos, inclusive estáticos, da mesma forma como faz em classes. trait StaticTrait { public static $instances; public $description; } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 64. Traits podem usar variáveis estáticas● Só não podem defini-las. trait StaticTrait { public function $playDice() { static $side = 1; $side++; if ($side > 6) $side = 1; return $side; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 65. Classes podem alterar a visibilidade de métodos de traits● Métodos públicos podem se tornar privados ou protegidos. class ClassC { use SpecialTrait { doSomeSpecial as protected; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 66. Traits podem declarar métodos abstratos● Dessa forma, um trait pode também se tornar um contrato, como uma interfacetrait BaseTrait{ public function doSomeAbstract();} www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 67. Traits podem usar traits● Métodos públicos podem se tornar privados ou protegidos. trait OneTrait { use OtherTrait; } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 68. Existem funções para Traits● class_uses: retorna os traits usados pela classe dada.● get_declared_traits: retorna os array de todos os traits declarados.● trait_exists: verifica se o trait existe. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 69. Quer saber mais sobre traits?www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 70. Palestra: DCI com PHP● Sala Digital 2● Hoje às 17h00min● Esta palestra apresentará o padrão de arquitetura DCI (Data Context Interaction) e como ele pode ser implementado em PHP.● Onde? Na www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 71. Palestra: Gerenciando aspectos e eventos com Zend Framework 2● Sala Digital 2● Amanhã, às 17h00min● Esta palestra apresentará o componente Zend_EventManager, que por acaso, tem um trait.● Onde? Na www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 72. É isso aí, pessoal!● www.fgsl.eti.br● flavio.lisboa@fgsl.eti.br● @fgsl www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 73. Referências● Schärli, N. et alli. Traits: Composable Units of Behaviour. http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf● Weldon, G. PHP 5.4: Begin your love affair with Traits. http://www.slideshare.net/predominant/php-54-begin-your- love-affair-with-traits-10118525 www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.