Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
|
informatique:programmation:php:poo [2011/10/19 19:21] benoit |
informatique:programmation:php:poo [2018/09/06 19:10] (Version actuelle) |
||
|---|---|---|---|
| Ligne 373: | Ligne 373: | ||
| ==== Réécrire une méthode héritée ==== | ==== Réécrire une méthode héritée ==== | ||
| + | <sxh php> | ||
| <?php | <?php | ||
| class A | class A | ||
| Ligne 378: | Ligne 379: | ||
| public function test() | public function test() | ||
| { | { | ||
| - | return "test\n"; | + | return "test"; |
| } | } | ||
| } | } | ||
| Ligne 388: | Ligne 389: | ||
| // Ici on dit que $retour est égale au resultat de la methode "test" de la classe parente | // Ici on dit que $retour est égale au resultat de la methode "test" de la classe parente | ||
| $retour = parent::test(); | $retour = parent::test(); | ||
| - | return $retour; | + | return $retour." avec des chose en plus\n"; |
| } | } | ||
| } | } | ||
| Ligne 396: | Ligne 397: | ||
| echo $trucA->test(); | echo $trucA->test(); | ||
| + | echo "\n"; | ||
| echo $trucB->test(); | echo $trucB->test(); | ||
| ?> | ?> | ||
| + | </sxh> | ||
| + | Resultat attendu : | ||
| + | test | ||
| + | test avec des chose en plus | ||
| ==== Imposer des contraintes ==== | ==== Imposer des contraintes ==== | ||
| + | Restreindre l'utilisation d'une classe qu'aux classes filles. | ||
| + | <sxh php> | ||
| + | <?php | ||
| + | abstract class ClasseMere | ||
| + | { | ||
| + | } | ||
| + | | ||
| + | class ClasseFille extends ClasseMere | ||
| + | { | ||
| + | } | ||
| + | | ||
| + | $truc1 = new ClasseFille; //Aucun problème pour utiliser la classe ClasseFille | ||
| + | $truc2 = new ClasseMere; //En revanche il y a une restriction pour utiliser la classe ClasseMere. Une erreur aura lieu. | ||
| + | ?> | ||
| + | </sxh> | ||
| + | |||
| + | |||
| + | Obliger les classes filles à réécrire certaines méthodes de la classe parente. | ||
| + | <sxh php> | ||
| + | <?php | ||
| + | abstract class ClasseMere | ||
| + | { | ||
| + | //Pour définir une méthode comme étant abstraite, il faut que la classe elle-même soit abstraite ! | ||
| + | abstract public function Afficher(); | ||
| + | // Il n'y a pas d'instruction dans cette methode, Elle ne peut pas en contenir | ||
| + | // Les classes Filles seront toutes obligées de réécrire le methode Afficher() | ||
| + | } | ||
| + | |||
| + | class ClasseFille extends ClasseMere | ||
| + | { | ||
| + | public function Afficher() | ||
| + | { | ||
| + | echo "Methode obligatoirement ecrite dans la classe fille\n"; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | $truc = new ClasseFille; | ||
| + | $truc->Afficher(); | ||
| + | ?> | ||
| + | </sxh> | ||
| + | |||
| + | Restreindre l'héritage d'une classe (classe finale ne pouvant être héritée) et la empêcher réécriture d'une methode. | ||
| + | |||
| + | <sxh php> | ||
| + | <?php | ||
| + | abstract class ClasseMere | ||
| + | { | ||
| + | // Ceci est une methode finale ne pouvent être héritée | ||
| + | final public function Methode() | ||
| + | { | ||
| + | echo "Hello\n"; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Cette classe est déclarée comme finale, aucun classe ne peut en hériter | ||
| + | final class ClasseFille extends ClasseMere | ||
| + | { | ||
| + | // Erreur fatale, car le methode "Methode" était déclarée comme final dans la classe parente. | ||
| + | public function Methode() | ||
| + | { | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Erreur fatale, car notre classe hérite d'une classe finale. | ||
| + | class ClassePetiteFille extends ClasseFille | ||
| + | { | ||
| + | } | ||
| + | ?> | ||
| + | </sxh> | ||
| + | |||
| + | ==== Résolution statique à la volée ==== | ||
| + | <sxh php> | ||
| + | <?php | ||
| + | class Mere | ||
| + | { | ||
| + | public static function lancerLeTest() | ||
| + | { | ||
| + | self::quiEstCe(); | ||
| + | } | ||
| + | |||
| + | public function quiEstCe() | ||
| + | { | ||
| + | echo "Je suis la classe Mere !\n"; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | class Enfant extends Mere | ||
| + | { | ||
| + | public function quiEstCe() | ||
| + | { | ||
| + | echo 'Je suis la classe Enfant !'; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | Enfant::lancerLeTest(); | ||
| + | ?> | ||
| + | </sxh> | ||
| + | |||
| + | Résultat attendu : | ||
| + | Je suis la classe Mere ! | ||
| + | |||
| + | ==== Pour résumer ==== | ||
| + | * Avec l'attribut **protected** il est possible de permettre au classe fille d'utiliser l'attribut contrairement à l'attribut **private** | ||
| + | * **abstract** dans une classe empèche d'utiliser cette classe en dehors d'une classe fille | ||
| + | * **abstract** dans une méthode oblige les classes filles à réécrire la méthode. | ||
| + | * **final** permet de déclarer une méthode ou classe comme non "héritable" | ||
| + | * **parent::methode()** permet de reprendre les éléments d'une methode parente y ajouter modifier des éléments | ||