Cours ⇒ Cour PHP facebook twitter youtube

La programmation objet ⇒ & L’héritage



1 Introduction

2 Protected

3 Substitution

4 Héritage en cascade

 

1-Introduction

L’héritage est un concept très important dans POO.Cela permet d’utiliser la classe sans le répéter.

Une classe fille hérite d’une classe mère, c’est-à-dire que la classe fille accédé à tout l’attribut et méthode  publiques de la classe mère.

Par exemple la classe Mammifère hérite de la classe Animal.

Remarque

Pour crée la classe poisson qui hérite de la classe Animal ,il faut utiliser le mot clé extends entre le nom de la classe fille et lle nom de la classe mère.

On va cree le fichier poisson_class.php

< ?php
Class poisson extends  Animal
{
}
?>

Exercices

On va cree deux classes une de chat ,de poisson les deux classe hérite de la classe Animal ont accée aux attributs publique de la classe Animal

On va cree une page nomme page_heritage.php

chat_class.php

<?php
//cree le chat
class Chat extends Animal
{
//les attributs
private $race;//la race du chat
//accesseur
public function getrace()
{
return $this->race; //retourne la race du chat
}
public function setrace($race)
{
$this->race=$race; //écrit dans l'attribut race
}
 //on va créer une méthode miauler
 public function miauler()
{ 
 echo "Miaou!!!<br>";
}
}//fin classe chat
?>

poisson_class.php

<?php 
class Poisson extends Animal
{
 //l'attribut
 private $vivant_en_mer;
//les accesseurs 
public function getType()
{
if($this->vivant_en_mer)
{
   return "vivant en mer";                                        
  }//fin if
   else if($this->vivant_en_mer==false)
       { return "ne vivant pas en mer";}
       else{ return " ";}                              
      }
public  function setType($vivant_en_mer)
{
 $this->vivant_en_mer=$vivant_en_mer;
 }
 public function nager()
{                            
 return "je nage <br>";}              
 }//fin la classe
?>

page_heritage.php

<?php
//chargement des classes
require_once('Animal_class.php');
require_once('chat_class.php');
require_once('poisson_class.php');
//instanciation  de poisson qui appele le constucteur de la classe Animal
$poisson1= new Poisson('rouge',5);
//l'instanciation de la classe chat qui appele le constructeur de la classe Animal
$chat= new Chat('gris',20);
// on vas lire le poids du chat par l'accesseur de la classe mère Animal
echo "Le poids du chat est: ".$chat->getPoids()." Kg <br>";
// on vas lire le poids du poisson  par l'accesseur de la classe mère Animal
echo "Le poids du poisson est: ".$poisson1->getPoids()." Kg <br>";
//lire l'accesseur de sa propre classe
$poisson1->setType(true);
echo "le type de poisson est : ".$poisson1->getType()."<br>";
//lire la race du chat par sa propre classe
$chat->setrace('tigre');
echo " Le chat est de race : ".$chat->getrace()."<br>";
//on va appler la methode de la classe chat
$chat->miauler();
//appler la méthode statique
echo "<br>Les  nombres d'animaux instancier est : ".Animal::getcompteur();
?>

Afficher:

Appel du constructeur.
Appel du constructeur.
Le poids du chat est: 20 Kg
Le poids du poisson est: 5 Kg
le type de poisson est : vivant en mer
Le chat est de race : tigre
Miaou!!!

Les nombres d'animaux instancier est : 2

 

2 Protected

Ce type de visibilité est équivalent à private sauf que les classes filles peuvent voir les attributs rotected de la classe mère.

Si non ajouter $age de visibilité protégée( protected) dans la classe mère Animal :

<?php
class Animal
{
//déclaration des attributs
private $couleur= "noir" ;
private $poids=10 ;
protected $age=0;


L’attribut $age elle a aucune accesseur publique dans les filles ou mère donc on peut pas lire celui-ci ou modifier

On va créer fonction AfficherAttribut() dans classe Poisson

public function AfficherAttribut()
{
 echo" type : ".$this->vivant_en_mer."<br>";//oh  privé dze cette classe
echo"Age est : ".$this->age."<br>";//ok car l'attribut est protected dans la classe mère
echo"poid".$this->poids."<br>"; //erreur car l'attribut est private dans la classe mère
//pour lire ou modifiercette attribut il faut passer par ses accesseur publique
 }//fin AfficherAttribut()

On va teste cette méthode

Page_heritage_2.php

<?php
require_once('Animal_class.php');
require_once('poisson_class.php');
//l'instanciation de la classe poisson qui apelle le constructeur de la classe mère
$poisson2= new Poisson('gris',8);
//lire le poids de poisson
echo "le poids de poisson est : ".$poisson2->getpoids()." kg <br>";
//mise a jour le type de poisson
$poisson2->setType(true);
$poisson2->AfficherAttribut();
?>

Afficher une erreur

Appel du constructeur.
le poids de poisson est : 8 kg
type : 1
Age est : 0

héritage en php

Parce que l’attribut poids est private dans la classe mère Animal

Remarque :

Il est conseiller de mettre les attributs en visibilité protected car la classe elle-même ,les filles de la classe qui en héritent ,ont accès à cet attribut.

Donc on va changer l’attribut dans la classe Animal.

private $couleur= "noir" ; => protected  $couleur= "noir" ;

private $poids=10 ; => protected  $poids=10 ;

 protected $age=0;

3 Substitution

La substitution sert à modifier une méthode déjà existante  dans une classe mère afin de modifier le comportement.

Exemple pour substituer la méthodes  manger_animal(Animal $animal_mange)  de la classe mère Animal. Afin d’initialiser le type du poisson mangé, donc il faut ajouter cette méthode dans la classe Poisson et la mettre autrement.

public function manger_animal(Animal $animal_mange)
{
if(isset($animal_mange->race))
{$animal_mange->race= "";}
if(isset($animal_mange->vivant_en_mer))
{$animal_mange->vivant_en_mer="";}
}//finmanger_animal()

Le problème est que cette méthode  initialise correctement l’attribut vivant_en_mer du poisson mangé mais n’initialise plusson poids et sa couleur .on peut pas changer son poids et sa couleur

Car les attribut sont private dans la classe Animal.

La solution est d’appeler la méthode  manger_animal(Animal $animal_mange)

De la classe mère Animal dans la méthode manger_animal(Animal $animal_mange)

De la classe fille Poisson

public function manger_animal(Animal $animal_mange)
{
//appeler la méthode manger_animal(Animal $animal_mange) de la classe Animal parente
parent::manger_animal($animal_mange);
if(isset($animal_mange->race))
{$animal_mange->race= "";}
if(isset($animal_mange->vivant_en_mer))
{$animal_mange->vivant_en_mer="";}
}//finmanger_animal()

Le mot clé parent désignant la classe mère

Page_heritage_3.php

<?php
require_once('Animal_class.php');
require_once('poisson_class.php');
// linstanciation de la classe Poisson
$poisson3= new Poisson('rouge', 8);//on appeon le costructeur de la mère Animal
//mise a jour le type de poisson
$poisson3->setType(true);
//instanciation de la classe Poisson
$poisson4 = new Poisson('noir',10);
//mettre a jour le type
$poisson4->setType(false);
$poisson4->manger_animal($poisson4);
echo"type de poisson mager est : ".$poisson4->getType()."<br>";
echo"le poids de poisson manger est : ".$poisson4->getPoids()." kg<br>";
?>

Afficher :

Appel du constructeur.
Appel du constructeur.
type de poisson mager est : ne vivant pas en mer
le poids de poisson manger est : 0 kg

Le poids a été initialisé à 0 par la méthode manger_animal(Animal $animal_mange) de la classe mère Animal.

4 Héritage en cascade

Une classe ne peut hériter que d’une classe et une seule classe qui elle-même peut hériter dune classe, etc….

               

Dans ce schéma montre que les classes Espadon et Carpe hérite de la classe Poisson qui hérite e de la classe Animal

La classe Espadon accéde à

  1. Tous les attributs et méthodes privés, protèges et publics d’elle-même.
  2. Tous les attributs et méthodes protégés et publics de la classe Poisson.
  3. Tous les attributs et méthodes protégés et publics de la classe Animal.
  4. Tous les attributs et méthodes public de la classe Chat.

 

 

 


Changer le fond
Oregionale Skin
7astuces
Sélectionnez un Fond (11)
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces
Fond de contenu
7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces 7astuces