Programmation orientée objet
Dernière mise à jour le 16 novembre 2022
Mise en contexte
Vous connaissez déjà la programmation orientée objet. Il n'est donc pas nécessaire de revenir sur les concepts fondamentaux.
Je vous propose plutôt de jeter un coup d'oeil sur un exemple de base. Vous verrez que la syntaxe utilisée ressemble à celle des autres langages de programmation que vous connaissez déjà.
L'exemple est celui d'une classe représentant un compte bancaire, d'une autre représentant un compte d'épargne (une spécialisation du compte bancaire) et d'un script utilisant ces deux classes.
La classe CompteBancaire
<?php // ---------------------------------------------------------------------------- // Représente un compte bancaire général. // ---------------------------------------------------------------------------- class CompteBancaire { private $devise; private $solde; private $titulaire; // ------------------------------------------------------------------------ // Constructeur // ------------------------------------------------------------------------ public function __construct($devise, $solde, $titulaire) { $this->devise = $devise; $this->solde = $solde; $this->titulaire = $titulaire; } // ------------------------------------------------------------------------ // Destructeur (non obligatoire) // ------------------------------------------------------------------------ public function __destruct() { // ... } // ------------------------------------------------------------------------ // Méthodes GET // ------------------------------------------------------------------------ public function getDevise() { return $this->devise; } public function getSolde() { return $this->solde; } public function getTitulaire() { return $this->titulaire; } // ------------------------------------------------------------------------ // Méthodes SET // ------------------------------------------------------------------------ protected function setSolde($solde) { $this->solde = $solde; } public function crediter($montant) { $this->solde += $montant; } // -------------------------------------------------------------------------- // Méthode appelée lorsqu'on affiche l'instance avec "echo" ou "print". // -------------------------------------------------------------------------- public function __toString() { return "Le solde du compte de $this->titulaire est de " . $this->solde . " " . $this->devise; } }
La classe CompteEpargne
<?php // le "require_once" (au lieu de "require") est important pour être indépendant // de l'ordre des "require" dans les scripts qui utilisent ces classes require_once "classes/CompteBancaire.php"; // ---------------------------------------------------------------------------- // Représente un compte d'épargne, c'est-à-dire qui génère des intérêts. // ---------------------------------------------------------------------------- class CompteEpargne extends CompteBancaire { private $tauxInteret; // -------------------------------------------------------------------------- // Constructeur // -------------------------------------------------------------------------- public function __construct($devise, $solde, $titulaire, $tauxInteret) { // appelle le constructeur de la classe mère parent::__construct($devise, $solde, $titulaire); $this->tauxInteret = $tauxInteret; } // -------------------------------------------------------------------------- // Méthodes GET // -------------------------------------------------------------------------- public function getTauxInteret() { return $this->tauxInteret; } // -------------------------------------------------------------------------- // Calcul des intérêts. Le paramètre est facultatif. // -------------------------------------------------------------------------- public function calculerInterets($ajouterAuSolde = false) { $interets = $this->getSolde() * $this->tauxInteret; if ($ajouterAuSolde == true) $this->setSolde($this->getSolde() + $interets); return $interets; } // -------------------------------------------------------------------------- // Méthode appelée lorsqu'on affiche l'instance avec "echo" ou "print". // -------------------------------------------------------------------------- public function __toString() { return parent::__toString() . '. Le taux d\'interet est de ' . $this->tauxInteret * 100 . '%.'; } }
Le fichier index.php
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title>Exemple de POO en PHP</title> </head> <body> <?php require "classes/CompteBancaire.php"; require "classes/CompteEpargne.php"; $compteBob = new CompteBancaire("dollars", 150, "Bob"); echo $compteBob . "<br>"; $compteBob->crediter(100); echo $compteBob . "<br><br>"; $comptePatoche = new CompteEpargne("euros", 200, "Patoche", 0.05); echo $comptePatoche . "<br>"; echo "Intérêts pour ce compte : " . $comptePatoche->calculerInterets() . " " . $comptePatoche->getDevise() . "<br>"; $comptePatoche->calculerInterets(true); echo $comptePatoche . "<br>"; ?> </body> </html>
Sortie :
Le solde du compte de Bob est de 150 dollars
Le solde du compte de Bob est de 250 dollars
Le solde du compte de Patoche est de 200 euros. Le taux d'interet est de 5%.
Intérêts pour ce compte : 10 euros
Le solde du compte de Patoche est de 210 euros. Le taux d'interet est de 5%.
Quelques conseils
-
Réservez un répertoire (ex :
classes/
) pour y mettre les classes de votre application. -
Débutez le nom d'un fichier PHP contenant une définition de classe par une lettre majuscule (ex
CompteBancaire.php
) ou ajoutez-lui le suffixe ".class" (ex :compte_bancaire.class.php
).
Objet d'accès aux données
Une technique souvent utilisée avec les bases de données est celle de l'objet d'accès aux données ou en anglais DAO pour data access object.
Il s'agit en gros de cacher à l'intérieur de classes et d'objets tous les accès à la base de données.
Nous avons vu un exemple en classe avec la solution orientée objet à l'exercice préparatoire au TP2. Jetez-y un coup d'oeil, ne serait-ce que pour voir comment on travaille avec des méthodes et des membres "static".
Questions et exercices
Question 1
Écrivez le code PHP d'une classe simple avec une seule variable membre. Ajoutez-y :
- un constructeur avec paramètre;
- une méthode "get";
- une méthode "set";
- une méthode __toString().
Question 2
Donnez le code pour créer un objet de la classe de la question précédente.
Question 3
Donnez la déclaration de la classe "Terrier" dérivée de la classe "Chien".
Question 4
Donnez un exemple d'appel du constructeur de la classe mère à partir du constructeur d'une classe enfant ou d'appel d'une méthode quelconque de la classe mère dans une méthode de la classe fille. Quel mot-clé avez-vous utilisé?
Question 5
Donnez un exemple d'appel à une méthode "static" d'une classe donnée.
Question 6
Expliquez à quoi sert le mot-clé self
comme dans self::$variable
.
Questtion 7
Donnez la différence entre les instructions required
et required_once
.