Créer un système de panier d'achat avec PHP et MySQL. Le système de panier d'achat permettra aux visiteurs du site Web de rechercher des produits, d'ajouter des produits au panier et de passer des commandes.
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.
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