PHP – Héritage

En programmation orientée objet, l’héritage permet à une classe d’utiliser les propriétés et les méthodes d’une classe existante. Souvent, nous rencontrons des situations où nous devons créer une nouvelle classe avec toutes les fonctionnalités d’une classe existante et quelques méthodes supplémentaires. Dans ces cas, nous pouvons soit copier toutes les propriétés et méthodes de la classe existante dans la nouvelle classe pour les rendre disponibles dans la nouvelle classe, soit nous pouvons simplement hériter de l’ancienne classe.

Un des principaux avantages de l’héritage est la possibilité de réduire la duplication du code. La duplication de code se produit lorsqu’un programmeur écrit le même code plus d’une fois, un problème que l’héritage s’efforce de résoudre. Dans l’héritage, nous avons une classe mère avec ses propres méthodes et propriétés, et une classe fille qui peut utiliser le code de la classe mère. En utilisant l’héritage, nous pouvons créer un morceau de code réutilisable que nous n’écrivons qu’une seule fois dans la classe mère, et que nous utilisons à nouveau autant que nécessaire dans les classes filles.
 
 
Prenons un exemple simple pour le comprendre.
 


 
Considérons une classe Véhicule avec des méthodes de base comme accélérer() et freiner(). Maintenant, si nous devons créer deux autres classes Voiture et Camion, avec toutes les propriétés et méthodes de la classe Véhicule et quelques caractéristiques spécifiques disponibles seulement pour Voiture et Camion, nous pouvons le faire en héritant de la classe Véhicule.

La classe qui est héritée est appelée classe mère(ou super-classe ou classe de base) tandis que la classe qui hérite d’une autre classe est appelée classe fille(ou sous-classe ou classe dérivée).

Dans l’exemple ci-dessus, Véhicule sera la classe mère et la classe Voiture et Camion seront ses classes filles.
 

Syntaxe de l’héritage

En PHP, le mot-clé extends est utilisé pour spécifier le nom de la classe mère lors de la définition de la classe fille. Par exemple,
 


 

<?php
    class Vehicule {
        // code de la classe mère
    }
    
    class Voiture extends Vehicule {
        // code de la classe fille
    }
    
    class Camion extends Vehicule {
        // code de la classe fille
    }
?>

Voici quelques points importants à retenir lors de l’utilisation de l’héritage :

  • La classe fille ne peut accéder et utiliser que les propriétés et méthodes non privées de la classe mère.
  • La classe fille peut aussi avoir ses propres méthodes, qui ne seront pas disponibles pour la classe mère.

 
 
Maintenant, nous allons ajouter quelques méthodes à notre classe Vehicule et regardons comment nous pouvons les utiliser dans les classes filles Voiture et Camion.

<?php
    // classe mére
    class Vehicule {
        // propriété publique
        public $marque;
        public $vitesse;
        
        // fonction publique
        public function accelerer() {
            echo $this->marque. " accélère...\n";
        }
        
        // fonction publique
        public function freiner() {
            echo $this->marque. " a freiné...\n";
        }
    }
    
    // classe fille
    class Voiture extends Vehicule {
        // Pas de code
    }
    
    // classe fille
    class Camion extends Vehicule {
        // Pas de code
    }
?>

Maintenant, dans le même fichier, nous allons écrire le code de test.

<?php
    $voiture = new Voiture();
    $voiture->marque = "Audi";
    
    $camion = new Camion();
    $camion->marque = "BM";
    
    // appeler les méthodes de la classe véhicule
    $voiture->accelerer();
   $voiture->freiner();
	
   $camion->accelerer();
   $camion->freiner();
?>

La sortie :

Audi accélère...
Audi a freiné...
BM accélère...
BM a freiné...

 
 

Classe fille avec ses propres méthodes et propriétés

Lorsqu’une classe fille hérite d’une classe mère, elle peut accéder et utiliser tous les membres non privés de la classe mère. Nous le savons, mais une classe fille peut avoir ses propres propriétés et méthodes ? Oui, elle peut en avoir. Prenons un exemple pour voir comment nous pouvons le faire :

<?php
    // classe mére
    class Vehicule {
        // propriété publique
        public $marque;
        public $vitesse;
        
        // fonction publique
        public function accelerer() {
            echo $this->marque. " accélère...\n";
        }
        
        // fonction publique
        public function freiner() {
            echo $this->marque. " a freiné...\n";
        }
    }
    
    // classe fille
    class Voiture extends Vehicule {

        public function conduire() {
            echo "Marque : " . $this->marque . "\n";
            echo "Bonne conduite...\n";
        }

    }
    
    // classe fille
    class Camion extends Vehicule {
        // Pas de code
    }
?>

Maintenant, nous allons écrire le code de test.

<?php
    $voiture = new Voiture();
    $voiture->marque = "Audi";
    $voiture->conduire();
	
	// appeler les méthodes de la classe véhicule
    $voiture->accelerer();
    $voiture->freiner();
?>

La sortie :

Marque : Audi
Bonne conduite...
Audi accélère...
Audi a freiné...

 
 

Le modificateur d’accès protected

Nous avons appris les différents modificateurs d’accès et comment nous pouvons les utiliser pour contrôler l’accès aux différentes propriétés et méthodes d’une classe.

Lorsqu’une classe fille hérite d’une classe mère, elle ne peut accéder et réutiliser que les propriétés et méthodes non privées. Mais nous ne devrions pas utiliser le modificateur d’accès public pour les propriétés, car elles deviennent accessibles depuis l’extérieur de la classe.

Pour permettre uniquement à la classe fille d’accéder aux propriétés et méthodes de la classe mère, nous pouvons utiliser le modificateur d’accès protected.

Lorsque nous définissons une propriété ou une méthode d’une classe comme étant protected, alors ces propriétés et méthodes ne sont accessibles que dans la classe fille qui hérite de la classe mère.

Prenons un exemple :

<?php
    // classe mére
    class Vehicule {
        // propriété protégé
        protected $marque;
        
        // fonction publique
        public function accelerer() {
            echo $this->marque. " accélère...\n";
        }
        
        // fonction publique
        public function freiner() {
            echo $this->marque. " a freiné...\n";
        }
		
        // fonction publique pour modifier la propriété marque
        public function setMarque($marque)
        {
            $this->marque = $marque;
        }
    }
    
    // classe fille
    class Voiture extends Vehicule {
	// méthode de la classe fille	
        public function conduire() {
            echo "Marque : " . $this->marque . "\n";
            echo "Bonne conduite...\n";
        }
		
    }

    $voiture = new Voiture();
    $voiture->setMarque("Audi");
    // appeler la méthode de la classe voiture
    $voiture->conduire();
	
    // appeler les méthodes de la classe véhicule
    $voiture->accelerer();
    $voiture->freiner();
?>

La sortie :

Marque : Audi
Bonne conduite...
Audi accélère...
Audi a freiné...

Dans l’exemple ci-dessus nous avons changé le modificateur d’accès de la variable marque comme protected, et donc pour modifier la propriété marque depuis l’extérieur, nous devons ajouter une méthode qui va faire ça, par ce qu’elle est inaccessible.
 
 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.