oujood.com

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

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.

chercher |

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

Exemple :       Copier 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

Exemple :       Copier 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

Exemple :       Copier 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


chapitre précédent     sommaire     chapitre suivant
Par carabde 20 Aout 2014



Voir aussi nos tutoriel :

fonction strstr, strstr

Trouve la première occurrence dans une chaîne

Objet QuickTime

Objet QuickTime
Ce chapitre décrit comment jouer des films avec l'objet QuickTime.

Manipulation de variables de chaines

Une variable de chaîne est employée pour stocker et manipuler du texte. Dans cet article de notre cours nous allons apprendre comment manipuler des variables contenant un texte