L’encapsulation consiste à déclarer les propriétés (attributs) en private (ou protected) au lieu de public. Pourquoi ? Pour l’intégrité des données, c’est-à-dire pour que les propriétés ne prennent pas n’importe quelles valeurs. Le programmeur d’une classe va ainsi construire un code fiable. Le programmeur utilisant de cette classe n’aura pas à se préoccuper de l’intégrité du code qu’il utilise.
L’unique façon d’assurer d’y arriver est donc de rendre inaccessible les attributs sauf en créant des méthodes publiques qui permettront de s’assurer que les valeurs prises restes dans celles admises. Ces méthodes filtrent donc l’usage des attributs. On appelle une méthode publique qui permet d'accéder à une propriété un getter (car commence en général par getXxxx) ou un accesseur, et on nomme une méthode publique qui permet de définir ou de modifier une propriété un setter (car commence en général par setXxxx) ou un mutateur.
Remarque : il est possible de déclarer des méthodes privées (qui ne seront utilisée que dans la classe elle même). Cela permet de renforcer la stabilité du code et ces évolutions.
Objectifs de la séance
Comprendre le concept d’encapsulation.
Mettre en œuvre l’encapsulation
EXERCICE N°1
Voici le code la classe Personne.
personne.php
<?php//----------------------------------------------------// fichier : personne.php// ---------------------------------------------------// Notion d'encapsulation : protection des propriétés// de l'objet. // IUT de Troyes - MMI 2ème année//----------------------------------------------------classPersonne {// Définition des attributs de la classeprivatestring $prenom;privatestring $nom;privateint $age;// Définition de la fonction constructeur publicfunction__construct($n,$p,$a) { $this->nom=$n;$this->prenom=$p;$this->age=$a; } // Définition du comportement sePresente() publicfunctionsePresente():string { return'Je m\'appelle '.$this->prenom.' '.$this->nom.' et j\'ai '.$this->age.' ans '; } }?>
Les propriétés sont déclarées private.
Voici le code de l’application seance3_exo1.php.
seance3_exo1.php
<?php//----------------------------------------------------// fichier : seance3_exo1.php// ---------------------------------------------------// Notion d'encapsulation : protection des propriétés// de l'objet. // IUT de Troyes - MMI 2ème année//----------------------------------------------------require'personne.php';// Nouvelle instance de class.Personne $etudiant=newPersonne('Martin','Paul',19);echo $etudiant->sePresente().'<br>'; //Je m'appelle Paul Martin et j'ai 19 ans // Modification de l'attribut Nom $etudiant->nom='Durand';echo $etudiant->sePresente().'<br>'; // Je m'appelle Paul Durand et j'ai 19 ans ?>
A FAIRE
Créez les deux fichiers personne.php et seance3_exo1.php.
Testez seance3_exo1.php et répondez aux questions
Pourquoi l’exécution du code de seance3_exo1.php renvoie une erreur ?
Donnez une solution simple pour permettre l’exécution normale de ce code
EXERCICE 2
Nous allons ici modifier le code de la classe Personne pour répondre à un nouveau cahier des charges. Le nom d’une personne sera obligatoirement en majuscules. Le programmeur qui utilisera cette classe pourra créer une instance sans se soucier de cette contrainte. C’est donc à la classe de gérer conversion du nom en majuscules. Voici comment.
Code de la classe Personne2
personne2.php
<?php//----------------------------------------------------// fichier : personne2.php// ---------------------------------------------------// Notion d'encapsulation : protection des propriétés// de l'objet. // IUT de Troyes - MMI 2ème année//----------------------------------------------------classPersonne2 {// Définition des attributs de la classeprivatestring $prenom;privatestring $nom;privateint $age;// Définition de la fonction constructeur publicfunction__construct($n,$p,$a) { $this->setNom($n);$this->prenom=$p;$this->age=$a; } // Définition du comportement sePresente() publicfunctionsePresente():string { return'Je m\'appelle '.$this->prenom.' '.$this->nom.' et j\'ai '.$this->age.' ans '; }// initialisation du nom en majsuculespublicfunctionsetNom(string $n):void {$this->nom=strtoupper($n); } }?>
Voici le code de l’application seance3_exo2.php
seance3_exo2.php
<?php//----------------------------------------------------// fichier : seance3_exo2.php2// ---------------------------------------------------// Notion d'encapsulation : protection des propriétés// de l'objet. // IUT de Troyes - MMI 2ème année//----------------------------------------------------require'personne2.php';// Nouvelle instance de class.Personne $etudiant=newPersonne2('Martin','Paul',19); // le nom est en minusculesecho $etudiant->sePresente().'<br>'; //Je m'appelle Paul MARTIN et j'ai 19 ans (nom en majuscules)// Modification de l'attribut Nom $etudiant->setNom('Durand'); // nom en minuscules echo $etudiant->sePresente().'<br>'; // Je m'appelle Paul DURAND et j'ai 19 ans (nom en majuscules)?>
A FAIRE
Créez une nouvelle version du code de la classe (Personne2) et de l’application (seance3_exo2)
Testez seance3_exo2.php
Exercice N°3
Nous allons écrire la classe connexion_sql qui permet de gérer la connexion à des bases de données MYSQL. Chaque fois que nous aurons besoin de gérer une connexion à une base de données, il suffira de créer une instance de cette classe. L’exercice proposé se limitera à quelques propriétés et quelques méthodes. La classe ne sera donc pas opérationnelle. Mais sa programmation devra nous permettre d’assimiler le concept d’encapsulation.
Ecrire la classe ConnexionSQL :
Les propriétés
adresseip : adresse IP du serveur
nombase : nom de la base de données
utilisateur : nom de l’utilisateur
mdp : mot de passe
Les méthodes
constructeur
lire_connexion qui retourne adresseip, nombase et utilisateur.
Ecrire l’application seance3_exo3.php
seance3_exo3.php
<?php//----------------------------------------------------// fichier : seance3_exo3.php// ---------------------------------------------------// Notion d'encapsulation : protection des propriétés// de l'objet. // IUT de Troyes - MMI 2ème année//----------------------------------------------------// appel de la classerequire'connexion_sql.php';// création d'une première instance $connexion1=newConnexion_SQL('127.0.1.1','test','root','');echo $connexion1->lire_connexion();// Création d'une deuxième instance $connexion2=newConnexion_SQL('serveur','test','root','');// serveur n'est pas une @ip valideecho $connexion2->lire_connexion();?>
Testez le code
Questions complémentaires
modifier la classe Connexion_SQL pour vous assurer que l'IP donnée par l'utilisateur est dans un format valide. Sinon, afficher un message d'erreur.