PHP 5.3 parte 2: Late Static Bindings
      Na primeira parte desta série abordamos a utilização de namespaces. Nessa segunda parte vamos abordar a utilização de “Late Static Bindings” que é um novo recurso incluído à partir da versão 5.3, que por sinal, é muito interessante.
É mais comum o uso de “Late static bindings” em chamadas de métodos staticos em um contexto de herança. Apesar que não ser limitado somente a métodos staticos.
Para melhor entendermos onde se aplica a utilização de “Late static bindings” vamos analisar o código abaixo:
As referências staticas para a classe corrente, como self:: e __CLASS__, são resolvidas para a classe no qual o método esta definido e não para a classe chamada em tempo de execução, que no caso a acima foi a class B, filha da classe A.
Dessa forma a saída da execução do script php anterior será:
Afim de resolver essa limitação foi escolhido uma palavra-chave para que seja possível referenciar a classe que é chamada em tempo de execução ao invés da classe em que o método pertence. A palavra-chave já reservada é static::.
Vamos alterar o script para que possamos acessar o médoto who() na classe B. Perceba que modificamos self:: para static::.
Ao executar o script php anterior, o resultado agora é diferente:
    
  
    É mais comum o uso de “Late static bindings” em chamadas de métodos staticos em um contexto de herança. Apesar que não ser limitado somente a métodos staticos.
Para melhor entendermos onde se aplica a utilização de “Late static bindings” vamos analisar o código abaixo:
<?php
class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    self::who();
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test();
As referências staticas para a classe corrente, como self:: e __CLASS__, são resolvidas para a classe no qual o método esta definido e não para a classe chamada em tempo de execução, que no caso a acima foi a class B, filha da classe A.
Dessa forma a saída da execução do script php anterior será:
A
Afim de resolver essa limitação foi escolhido uma palavra-chave para que seja possível referenciar a classe que é chamada em tempo de execução ao invés da classe em que o método pertence. A palavra-chave já reservada é static::.
Vamos alterar o script para que possamos acessar o médoto who() na classe B. Perceba que modificamos self:: para static::.
<?php
class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    static::who(); // static:: no lugar de ::self
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test();
Ao executar o script php anterior, o resultado agora é diferente:
B
    Páginas:
                  1
                        2
            
    
  


Novo Comentário: