Live Coding : PHP Orienté Objet - Héritages

24 mai 2020 - : PHP Tutoriel Live-Coding - : 5 commentaires - Tutoriel PHP Live-Coding Orienté Objet

Visualisez les fichiers de cette série sur GitHub

Dernière modification le 26 mai 2020

L'un des concepts du développement Orienté Objet est la possibilité de faire dépendre certains objets d'autres objets "parents".

Dans les articles précédents, nous avons créé un objet "Compte" qui permet de créer un compte bancaire.

Il existe cependant plusieurs types de comptes bancaires, certains offrent une possibilité de découvert, d'autres permettent de toucher des intérêts.

Nous allons donc modifier notre objet "Compte" pour pouvoir gérer des "sous-objets" qui en hériteront.

Pour éviter d'instancier notre classe "Compte", nous allons la passer en classe abstraite par le mot clé "abstract".

Elle ne pourra donc plus être instanciée directement.

abstract class Compte
{

}

De plus, toutes les propriétés qui pourront être manipulées dans le "sous-objet" devront être en visibilité "public" ou "protected". En effet, les propriétés en visibilité "private" ne sont pas disponibles par héritage.

/**
 * Titulaire du compte
 * @var string
 */
protected $titulaire;

/**
 * Solde du compte
 * @var float
 */
protected $solde;

L'héritage

Nous allons créer deux classes qui hériteront de la classe "Compte". Elles s'appelleront "CompteCourant" et "CompteEpargne" dans les fichiers du même nom.

class CompteCourant extends Compte
{

}
class CompteEpargne extends Compte
{

}

Nous devrons, pour le moment, appeler chacun des fichiers avant de pouvoir les utiliser. Nous verrons dans l'article suivant une méthode pour charger automatiquement tous les fichiers nécessaires.

require_once 'classes/Compte.php';
require_once 'classes/CompteCourant.php';
require_once 'classes/CompteEpargne.php';

Le compte courant

Focalisons nous sur le compte courant.

C'est un compte bancaire dans lequel nous allons autoriser un découvert.

Son constructeur nécessitera au moins les informations du compte bancaire (titulaire et solde) et en option un découvert, mis à 500 euros par défaut.

Le constructeur sera donc le suivant

/**
 * Découvert autorisé
 * @var int
 */
private $decouvert;

/**
 * Constructeur du compte courant
 * @param string $titulaire Titulaire du compte
 * @param float $solde Solde du compte
 * @param int $decouvert Découvert autorisé
 * @return void 
 */
public function __construct(string $titulaire, float $solde, int $decouvert = 500)
{
    // On appelle le constructeur du parent
    parent::__construct($titulaire, $solde);

    // On définit les propriétés "locales"
    $this->decouvert = $decouvert;
}

Nous pourrons donc instancier un compte courant de cette façon

// On instancie sans préciser le découvert
$compte1 = new CompteCourant('Benoit', 2000);

// On instancie en précisant le découvert
$compte2 = new CompteCourant('Benoit', 2000, 200);

Etant donné que notre compte devra bénéficier d'un découvert, nous pourrons avoir un solde négatif jusqu'au montant du découvert.

Nous devrons donc modifier la méthode "retirer" pour le "CompteCourant" spécifiquement.

Nous écrirons donc

public function retirer($montant){
    // On vérifie si le découvert permet le retrait
    if($this->solde - $montant > -$this->decouvert){
        $this->solde -= $montant;
    }else{
        echo 'Solde insuffisant';
    }
}

Enfin, la propriété "decouvert" étant privée, nous allons écrire ses accesseurs (Getter et Setter)

public function getDecouvert()
{
    return $this->decouvert;
}

public function setDecouvert(int $decouvert) : self
{
    $this->decouvert = $decouvert;

    return $this;
}

Le compte épargne

Pour le compte épargne, nous allons procéder de façon similaire afin de mettre en place le versement des intérêts.

Nous aurons donc une propriété "taux_interets" qui correspondra au taux d'intérêts du compte et un constructeur en conséquence. Nous allons choisir de rendre obligatoire la déclaration de ce taux dans le constructeur.

/**
 * Taux d'intérêts
 * @var int
 */
private $taux_interets;

/**
 * Constructeur du compte courant
 * @param string $titulaire Titulaire du compte
 * @param float $solde Solde du compte
 * @param int $taux Taux d'intérêts du compte
 * @return void 
 */
public function __construct(string $titulaire, float $solde, int $taux)
{
    // On appelle le constructeur du parent
    parent::__construct($titulaire, $solde);

    // On définit les propriétés "locales"
    $this->taux_interets = $taux;
}

Enfin, pour verser les intérêts, nous écrivons une méthode comme ceci

public function verserInterets(){
    if($this->solde > 0){
        $this->solde = $this->solde + ($this->solde * $this->taux_interets / 100);
    }else{
        echo 'Solde insuffisant';
    }
}

Sans oublier les accesseurs du taux d'intérêts

public function getTauxInterets()
{
    return $this->taux_interets;
}

public function setTauxInterets(int $taux) : self
{
    $this->taux_interets = $taux;

    return $this;
}

Obtenir de l'aide

Pour obtenir de l'aide, vous pouvez accéder au serveur Discord pour une entraide par chat

Visualisez les fichiers de cette série sur GitHub

Partager

Partager sur Facebook Partager sur Twitter Partager sur LinkedIn

Commentaires

Ecrire un commentaire

Brice a écrit le 27 mai 2020 à 23:51

Bonjour,

C'est quoi la différence entre instancier une classe et le faite créer une classe avec le mot extend ?

Répondre

Nouvelle-Techno.fr a répondu le 28 mai 2020 à 07:59

Bonjour, ce sont deux choses différentes. L'instanciation est traitée dans l'article sur les concepts de base.

Une classe peut être instanciée une ou plusieurs fois (sauf exceptions) qu'elle hérite ou non d'une autre classe.

L'héritage est comme un ajout de propriétés spécifiques à une classe qui existe déjà.

Répondre

Brice a répondu le 28 mai 2020 à 21:04

Bonsoir,

Ok, merci pour la réponse claire, je vois mieux la différence maintenant

Répondre

Brice a écrit le 27 mai 2020 à 01:08

Petite question, quel est la différence entre instancier un objet et créer un nouvel objet à partir d'un héritage ?

Répondre

Nouvelle-Techno.fr a répondu le 27 mai 2020 à 08:49

Bonjour,

Je suis désolé je ne comprends pas la question.

Merci

Répondre

Ecrire un commentaire