Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

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

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 :

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.