Résolution statique à la volée (Late Static Bindings)

PHP cours tutorial

Résolution statique à la volée

Voici un concept un peu compliqué et je vous conseille de le lire et le relire pour bien le comprendre.

Pour commencer je vous donne ce code exécutez le et regardez ce qui se passe

Code

Sélectionner le code

  <?php
  class A {
      public static function qui() {
          echo 'Je suis la classe parente A';
      }
      public static function test() {
          self::qui();
      }
  }
  class B extends A {
      public static function qui() {
           echo 'Je suis la classe fille B';
      }
  }
  B::test();
  ?>

 

Ce qui affichera

Je suis la classe parente A

La méthode test() été appelée depuis la classe fille B, alors pourquoi elle affiche A ?

La méthode test() n’a pas été réécrite, l’opérateur self :: (ou parent :: )  fait appeler la méthode qui() de la classe parente A, alors que nous voulons appeler  celle de la classe fille B.

Depuis PHP 5.3.0, PHP implémente une fonctionnalité appelée late static binding, en français la résolution statique à la volée, qui est utilisée pour choisir la classe appelée dans le cadre de l'héritage de méthodes statiques.

La résolution statique à la volée essaie de dépasser cette limitation en introduisant un mot clé qui fait référence à la classe qui est appelée durant l'exécution. Simplement, ce mot-clé vous permet de faire référence à B depuis test(), dans l'exemple précédent. Il a été décidé de ne pas introduire de nouveau mot clé, mais plutôt d'utiliser le mot static qui était déjà réservé.

Pour cela en utilise l’opérateur static :: qui a le même effet que self::, à sauf que static:: appelle l'élément de la classe qui est appelée pendant l'exécution.

Et voici notre code Rectifié :

Code

Sélectionner le code

  <?php
  class A {
      public static function qui() {
          echo 'Je suis la classe parente A';
      }
      public static function test() {
          static::qui(); // Ici, résolution à la volée
      }
  }
  class B extends A {
      public static function qui() {
           echo 'Je suis la classe fille B';
      }
  }
  B::test();
  ?>

 

Ce qui affichera

Je suis la classe fille B

Utilisation de static:: dans un contexte non statique

Dans les contextes non statiques, la classe appelée sera celle de l'objet. Comme $this-> essayera d'appeler des méthodes privées depuis le même contexte, utiliser static:: pourrait donner des résultats différents.

Notez aussi que static:: ne peut faire référence qu'à des attributs/méthodes statiques.

Exemple : Utilisation de static:: dans un contexte non statique

Sélectionner le code

  <?php
  class A {
      private function foo() {
          echo "success!\n";
      }
      public function test() {
          $this->foo();
          static::foo();
      }
  }
  class B extends A {
     /* foo() sera copiée dans B, par conséquent son contexte sera toujours A
      * et l'appel se fera sans problème */
  }
  class C extends A {
      private function foo() {
          /* La méthode originale est remplacée; le contexte est celui de C */
      }
  }
  $b = new B();
  $b->test();
  echo '<br />';
  $c = new C();
  $c->test();   //échoue
  ?>

 

Ce qui affichera :

success!
success!
success!

Fatal error: Call to private method C::foo() from context 'A' in www\poo\taste.php on line 8


Par carabde 20 Aout 2014