quinta-feira, 26 de julho de 2012

Late Static Binding no PHP

Late Static Binding existe a partir do PHP 5.3 e a maioria das explicações não são muito claras e por isso essa funcionalidade fica meio na... nuvem! 


A documentação do PHP define o Late Static Binding como "maneira de referenciar a classe chamada no contexto de herança estática"
ENTENDEU? 


Esta definição apesar de palavras bem usadas no nosso dia a dia não deixou muito claro a sua finalidade e ai ficamos muuito confusos... Felizmente esse é o tipo de conceito que não se entra na cabeça de "prima" e para ajudar a documentação do PHP tem bastante exemplo.

Chega de papo, a melhor forma de entender isso é vendo o CÓDIGO!

Para usar a Late Static Binding, precisamos de uma classe que herda de outra classe e alguns métodos estáticos para sobreescrevemos. Veja:

Late static binding - php 5.3
  1. class classePai {
  2.    
  3.     public static function normalCall() {
  4.         self::calledMethod();
  5.     }  
  6.     public static function lateStaticCall() {
  7.         static::calledMethod();
  8.     }  
  9.     public static function calledMethod() {
  10.         echo " Chamada na classe PAI \n";
  11.     }  
  12.    
  13. }
  14. class classeFilha extends classePai {
  15.    
  16.     public static function calledMethod() {
  17.         echo "Chamada na classe Filha \n";
  18.     }  
  19.    
  20. }


Veja bem, temos a classeFilha que extende da classePai...
Na classePai temos 3 métodos estáticos, normalCalllateStaticCallcalledMethod na classe filha temos apenas um método estático o calledMethod

Percebam que tanto na filha quanto na pai temos a classe calledMethod certo?
Pois bem, se chamarmos o método estático normalCall tanto com a classe filha como a pai o resultado seria  Chamada na classe PAI  veja um pequeno exemplo do uso.


USANDO FORMA COMUM PARA CHAMAR OUTRO METODO ESTATICAMENTE
  1.  classePai::normalCall(); // Chamada na classe PAI
  2.  classeFilha::normalCall(); // Chamada na classe PAI


Ou seja, independente de chamar o método estático na filha ou na pai a função que a classe normalCall irá chamar sempre será a calledMethod da classe pai, pois é isso que o self esta fazendo.

Agora, se fizermos a mesma coisa mais trocando o self por static que é como esta implementado no método lateStaticCall a chamada seria diferente pois o Late Static Binding estaria em ação, veja:

USANDO LATE STATIC BINDING NO PHP
  1.  classePai::lateStaticCall(); // Chamada na classe PAI
  2.  classeFilha::lateStaticCall(); // Chamada na classe Filha


Fonte: PHP.net (como sempre, rs)

Um comentário:

  1. Morri de ri com os memes do post, interessante isso do PHP 5.3

    ResponderExcluir