Dynamic-Mess.com


"The world is a dynamic mess of jiggling things..."

Héritage, classe abstraite et méthode Final en PHP

Article posté le 26-11-2013 dans la catégorie PHP

Voici quelques rappels sur des fonctions avancées de la programmation orientée objet en PHP. Ces fonctionnalités seront bien utiles dans le cadre de développement d'applications puissantes.

1- Héritage

L'héritage consiste à créer un modèle de classe qui reprend attributs et méthodes d'une classe parente, en y ajoutant les siens. Par exemple, la classe "gardien-de-but" hérite de la classe "joueur-de-foot". Elle permet d'y ajouter des spécificités. Cependant, elle n'héritera pas des données private, mais uniquement protected ou public.

class joueurDeFoot
{
    private $_champ1; //Ses classes filles n'en hériteront pas
    protected $_champ2; //Ses classes filles en hériteront
}
class gardienDeBut extends joueurDeFoot
{
    //Ici les spécifités de la classe
}

ATTENTION avec le comportement du constructeur :

- Si vous ne mettez pas de constructeur dans votre classe enfant (c'est à dire un constructeur propre à elle), seule le constructeur de la classe mère sera exécuté.

- Par contre, si vous spécifiez un constructeur propore à la classe fille, c'est, par défaut, uniquement celui-ci qui sera exécuté. Si vous voulez en plus exécuter celui de la classe mère, il faut mettre dans le constructeur de la fille :

parent::__construct();

Voici un exemple de test :

<?php
abstract class Toutou
{
    protected $variableA = "Vide";
    public function __construct() {
        $this->variableA =" Je suis remplie";
    }
}
class Tatie extends Toutou
{
    private $variableB ="vide";
    
    public function __construct() {
        parent::__construct();
        $this->variableB =" Remplie";
    }
    
    public function Test()
    {
        echo $this->variableA;
    }
    
    public function Testa()
    {
        echo "<br/>".$this->variableB;
    }
}
$Eric = new Tatie();
$Eric->Test();
$Eric->Testa();
?>

2- Classe abstraite

Une classe abstraite est une classe qui ne peut pas être instanciée. On peut donc dire qu'elle sert de modèle aux classes qui en hériteront. De plus, le mot clef abstract sert peut aussi servir à forcer les classes filles à réécrire une fonction. Dans notre cas, un gardien de but tirant dans le ballon différemment qu'un attaquant par exemple, nous devons réécrire la fonction :

abstract class joueurDeFoot
{
    private $_champ1; //Ses classes filles n'en hériteront pas
    protected $_champ2; //Ses classes filles en hériteront
    abstract public function tirerDansLeBallon();
}
class gardienDeBut extends joueurDeFoot
{
    //Ici les spécifités de la classe
    //Obligation de réécrire la fonction:
    public function tirerDansLeBallon()
    {
        //Code à exécuter...
    }
}

3- Le mot-clef Final

Final est l'inverse de abstract. Devant une fonction, il empêchera les classes filles de permettre la réécriture de la fonction. Devant la classe, il empêchera l'héritage de cette dernière.

4- Surcharge des méthodes

La surcharge de méthode permet à une classe fille de réécrire une fonction héritée afin d'en modifier le comportement. Cependant, un problème se pose si la méthode utilise un attribut privé de la classe mère. Pour résoudre ce problème, on doit appeller d'abord la méthode de la classe mère, avant d'executer son propre code  :

abstract class joueurDeFoot
{
    private $Intensite;
    public function tacler()
    {
        //code qui utilise la variable $this->Intensite
    }
}
class gardienDeBut extends joueurDeFoot
{
    //Ici les spécifités de la classe
    // Et ici surcharge de la fonction :
    public function tacler()
    {
        parent::tacler();
        //Et ici code qui utilise $this->Intensite
    }
}

 


Tweet
comments powered by Disqus