SlideShare une entreprise Scribd logo
1  sur  73
Télécharger pour lire hors ligne
Traits no PHP 5.4:
        muito além da herança




          Flávio Gomes da Silva Lisboa




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Quem sou eu

  Autor


Arquiteto e Desenvolvedor
                                                          Certificado


                                    Instrutor
   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Consultor




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Consultor




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Consultor




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Especialista em história em
       quadrinhos http://perse.doneit.com.br
     romocavaleirodoespaco.blogspot.com




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Não se preocupe, esta
   apresentação não fala do
        Lanterna Verde




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
Tudo começou aqui
           European Conference on
          Object-Oriented Programming




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Princípio de Design
“Identifique os aspectos de seu aplicativo que
variam 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.
Resumo
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.




   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Paper
Traits: “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.
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.
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.
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.
A programação de computadores se
apropria de termos de outras áreas
de conhecimento fazendo analogias




  www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Seria a herança genética?




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Na herança genética, cada filho
    recebe uma combinação de
caracterí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.
combinação probabilístico




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
combinação probabilístico




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
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.
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.
Mas esta não é a
            herança simples
         da orientação a objetos




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Nem esta




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Esta não é a herança da
       orientação a objetos




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
O problema com a analogia do
testamento, é que nesse caso cada
herdeiro leva uma parte da
herança.

E não é isso que acontece com a
orientação a objetos, na qual a cada
classe filha leva toda a herança.

   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
A herança simples da
orientação a objetos, então, é esta:




  www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Na herança simples, várias classes
podem reutilizar atributos e métodos
    de uma classe ancestral.

Mas o reuso não é pleno, já que, por herdar de
apenas uma classe, você pode acabar “copiando”
atributos e métodos de outra classe, gerando
código duplicado.

E o código duplicado é mutante: você não tem
um controle fácil sobre implementações.



   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Herança simples e código duplicado




  www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Nem pense nisso!




                                  Criar dependências implica
                                  em diminuir a flexibilidade




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Na arquitetura do software é
necessário encontrar um ponto de
equilíbrio entre instabilidade e
abstração




  www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
E a herança múltipla?

                                Animal




             Cavalo                              Pássaro




                              Pégaso




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Seria isto?

                                Animal




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Seria isto?

                                Animal




                       NÃO!
www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Seria mais parecido com isso:

                                  Animal




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
“A herança múltipla é boa, mas não
        há um bom modo de fazê-la”
                        Steve Cook

A herança múltipla permitiria combinar atributos
e métodos de várias classes em uma nova
classe.

Mas existem vários problemas decorrentes da
herança múltipla... por isso PHP não a
implementa.



    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Ah, mas eu posso usar interfaces...



Sim, mas interfaces não tem
implementaçã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.
Problema do Diamante




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Problema do Diamante
Conflito de nomes:
Se existem atributos
ou métodos
com nomes iguais,
mas contextos diferentes,
qual deve ser herdado?




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Problema do Diamante
Implementação:
Se um método de uma
classe ancestral for
sobrescrito pelas classes
herdadas, qual
implementação será
usada?




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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 algumas
coisas de todos.
Não queremos gerar um clone (até porque não dá
pra gerar um clone de mais de um original) mas
uma combinação de traços (atributos e métodos).



    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Composição de classes é um
            paliativo

Você pode contornar a inexistência de herança
múltipla fazendo com que uma classe contenha
outra, em vez de estendê-la.

Com essa abordagem, uma classe pode
artificialmente herdar tanto atributos quanto
mé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.
Composição de classes é um
              paliativo
<?php
namespace 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.
Composição de classes é um
        paliativo




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Composição de classes é um
        paliativo




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Paradoxo da Herança de Classes
Uma classe tem um papel primário de geradora
de instâncias, logo ela deve ser completa.

Mas como unidade de reuso, uma classe deve
ser pequena, com a menor implementação
possível.

Isso é contraditório!




    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Separação de papéis



Se a classe deve ser a geradora de instâncias,
alguém tem de assumir o papel de unidade de
reuso. É 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.
Traits

►Um trait provê um conjunto de métodos que
implementam comportamento.

►Classes e traits podem ser compostos por outros traits.

►Métodos         conflitantes          devem         ser      explicitamente
resolvidos.

►A composição com traits não afeta a semântica da
classe. É como se os métodos fossem declarados nela.



    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
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.
Usando um trait em PHP

   class ClassC
   {
       use SpecialTrait;
   }

Se uma classe herda um método que tem o
mesmo nome de um método contido em um trait, o
trait 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.
Usando vários traits em PHP

class Amazo
{
    use Aquaman, Flash;
}




 www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
Resolução de conflitos

trait Fifer
{
     public function buildHouse()
    {
         echo 'building a straw
house';
    }
}


   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Resolução de conflitos

trait Fiddler
{
     public function buildHouse()
    {
         echo 'building a stick
house';
    }
}


   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Resolução de conflitos

trait Practical
{
     public function buildHouse()
    {
         echo 'building a brick
house';
    }
}


   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Resolução de conflitos
class PerfectPig
{
    use Fifer, Fiddler, Practical;

}




    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Resolução de conflitos
class PerfectPig
{
     use Fifer, Fiddler, Practical
    {
        Practical::buildHouse insteadof
Fifer, Fiddler;
    }
}




   www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
Resolução de conflitos
class PerfectPig
{
     use Fifer, Fiddler, Practical
    {
        Practical::buildHouse insteadof
Fifer, Fiddler;
        Fifer::buildHouse as buildShitHouse;
    }
}




    www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
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.
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.
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.
Traits podem declarar métodos
                abstratos
●   Dessa forma, um trait pode também se tornar
    um contrato, como uma interface

trait BaseTrait
{
    public function doSomeAbstract();
}




     www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
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.
Quer saber mais sobre traits?




www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
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.
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.
É 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.
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.

Contenu connexe

Plus de Flávio Lisboa

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPFlávio Lisboa
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaFlávio Lisboa
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasFlávio Lisboa
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoFlávio Lisboa
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHPFlávio Lisboa
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework LaminasFlávio Lisboa
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?Flávio Lisboa
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Flávio Lisboa
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHPFlávio Lisboa
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoFlávio Lisboa
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPFlávio Lisboa
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamFlávio Lisboa
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosFlávio Lisboa
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosFlávio Lisboa
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosFlávio Lisboa
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasFlávio Lisboa
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadoresFlávio Lisboa
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)Flávio Lisboa
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Flávio Lisboa
 

Plus de Flávio Lisboa (20)

Criando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHPCriando testes integrados de APIs com PHP
Criando testes integrados de APIs com PHP
 
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e ArgentinaCooperativas de Software Livre: Uma comparação entre Brasil e Argentina
Cooperativas de Software Livre: Uma comparação entre Brasil e Argentina
 
Aprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com LaminasAprenda a afiar suas garras com Laminas
Aprenda a afiar suas garras com Laminas
 
Ciência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com métodoCiência e software livre: desenvolvendo com método
Ciência e software livre: desenvolvendo com método
 
Turbinando microsserviços em PHP
Turbinando microsserviços em PHPTurbinando microsserviços em PHP
Turbinando microsserviços em PHP
 
O que esperar do framework Laminas
O que esperar do framework LaminasO que esperar do framework Laminas
O que esperar do framework Laminas
 
PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?PHP Conference Brazil - What can we expect about framework Laminas?
PHP Conference Brazil - What can we expect about framework Laminas?
 
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
Algoritmos Genéticos em PHP - PHP Conference Brasil 2019
 
Criando microsserviços em PHP
Criando microsserviços em PHPCriando microsserviços em PHP
Criando microsserviços em PHP
 
Como se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundoComo se tornar o pior programador PHP do mundo
Como se tornar o pior programador PHP do mundo
 
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHPA demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
A demanda da santa entrega Batman: bugs e gargalos em aplicações PHP
 
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperamComunicação e padrões em código aberto: quando convergente e divergente cooperam
Comunicação e padrões em código aberto: quando convergente e divergente cooperam
 
Criação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dadosCriação de robôs em PHP para raspagem de dados
Criação de robôs em PHP para raspagem de dados
 
Amanhecer esmeralda
Amanhecer esmeraldaAmanhecer esmeralda
Amanhecer esmeralda
 
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de DadosEstudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
Estudo de Caso: Utilização de PHP no Serviço Federal de Processamento de Dados
 
Arquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviçosArquitetura PHP para um mundo orientado a microsserviços
Arquitetura PHP para um mundo orientado a microsserviços
 
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoasSemeando Liberdade: Como (e onde) o software livre inclui as pessoas
Semeando Liberdade: Como (e onde) o software livre inclui as pessoas
 
O que é programação de computadores
O que é programação de computadoresO que é programação de computadores
O que é programação de computadores
 
Economia em rede (comunidade)
Economia em rede (comunidade)Economia em rede (comunidade)
Economia em rede (comunidade)
 
Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)Aplicações Corporativas em PHP (CRM e ERP)
Aplicações Corporativas em PHP (CRM e ERP)
 

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

  • 1. Traits no PHP 5.4: muito além da herança Flávio Gomes da Silva Lisboa www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 2. Quem sou eu Autor Arquiteto e Desenvolvedor Certificado Instrutor www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 3. Consultor www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 4. Consultor www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 5. Consultor www.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.com www.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 Verde www.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 Programming www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 10. Princípio de Design “Identifique os aspectos de seu aplicativo que variam 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. Resumo 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. www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 12. Paper Traits: “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 se apropria de termos de outras áreas de 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 de caracterí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ístico www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 20. combinação probabilístico www.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 objetos www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 25. Nem esta www.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 objetos www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 28. O problema com a analogia do testamento, é que nesse caso cada herdeiro leva uma parte da herança. E não é isso que acontece com a orientação a objetos, na qual a cada classe 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 da orientaçã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 classes podem reutilizar atributos e métodos de uma classe ancestral. Mas o reuso não é pleno, já que, por herdar de apenas uma classe, você pode acabar “copiando” atributos e métodos de outra classe, gerando código duplicado. E o código duplicado é mutante: você não tem um 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 flexibilidade www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 33. Na arquitetura do software é necessário encontrar um ponto de equilíbrio entre instabilidade e abstraçã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égaso www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 35. Seria isto? Animal www.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: Animal www.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 Cook A herança múltipla permitiria combinar atributos e métodos de várias classes em uma nova classe. Mas existem vários problemas decorrentes da herança múltipla... por isso PHP não a implementa. 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 tem implementaçã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 Diamante www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 41. Problema do Diamante Conflito de nomes: Se existem atributos ou métodos com 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 Diamante Implementação: Se um método de uma classe ancestral for sobrescrito pelas classes herdadas, qual implementaçã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 algumas coisas de todos. Não queremos gerar um clone (até porque não dá pra gerar um clone de mais de um original) mas uma 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 paliativo Você pode contornar a inexistência de herança múltipla fazendo com que uma classe contenha outra, em vez de estendê-la. Com essa abordagem, uma classe pode artificialmente herdar tanto atributos quanto mé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 <?php namespace 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 paliativo www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 47. Composição de classes é um paliativo www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 48. Paradoxo da Herança de Classes Uma classe tem um papel primário de geradora de instâncias, logo ela deve ser completa. Mas como unidade de reuso, uma classe deve ser pequena, com a menor implementação possível. Isso é contraditório! www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 49. Separação de papéis Se a classe deve ser a geradora de instâncias, alguém tem de assumir o papel de unidade de reuso. É 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 que implementam comportamento. ►Classes e traits podem ser compostos por outros traits. ►Métodos conflitantes devem ser explicitamente resolvidos. ►A composição com traits não afeta a semântica da classe. É 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 o mesmo nome de um método contido em um trait, o trait 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 PHP class 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 conflitos trait Fifer { public function buildHouse() { echo 'building a straw house'; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 57. Resolução de conflitos trait Fiddler { public function buildHouse() { echo 'building a stick house'; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 58. Resolução de conflitos trait Practical { public function buildHouse() { echo 'building a brick house'; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 59. Resolução de conflitos class PerfectPig { use Fifer, Fiddler, Practical; } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 60. Resolução de conflitos class PerfectPig { use Fifer, Fiddler, Practical { Practical::buildHouse insteadof Fifer, Fiddler; } } www.fgsl.eti.br - Livre para reprodução desde que citada a fonte - @fgsl.
  • 61. Resolução de conflitos class PerfectPig { use Fifer, Fiddler, Practical { Practical::buildHouse insteadof Fifer, 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 interface trait 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.