Les 3 visibilités
Partie théorique
Pour cacher, ou rendre visible les détails internes d'une classe, on utilise un des 3 mots clés suivants : public, protected ou private.
Ces mots-clés déterminent où ces propriétés et méthodes peuvent être accédées.
public: La propriété ou la méthode peut être accédée de n'importe où.protected: La propriété ou la méthode peut être accédée depuis la classe elle-même et ses héritières.private: La propriété ou la méthode peut uniquement être accédée depuis la classe elle-même.
Lorsque l'on cache les détails internes d'une classe pour contrôler l'accès à ses propriétés, on dit que l'on encapsule les données de la classe.
Exemple pratique
Une classe Voiture
class Voiture {
public $marque;
protected $couleur;
private $vitesse;
public function __construct($marque, $couleur, $vitesse) {
$this->marque = $marque;
$this->couleur = $couleur;
$this->vitesse = $vitesse;
}
public function afficherMarque() {
print($this->marque);
print("\n");
}
protected function afficherCouleur() {
print($this->couleur);
print("\n");
}
private function afficherVitesse() {
print($this->vitesse);
print("\n");
}
}
$voiture = new Voiture("Peugeot", "rouge", "150 km/h");
$voiture->afficherMarque(); // fonctionne
$voiture->afficherCouleur(); // génère une erreur
$voiture->afficherVitesse(); // génère une erreur
Une classe VoitureEssence
class VoitureEssence extends Voiture {
protected function afficherCouleur() {
print($this->couleur);
print("\n");
}
private function afficherDetails() {
print($this->afficherMarque); // Possible car `public`
print($this->afficherCouleur); // Possible car `protected`
//print($this->afficherVitesse); //Génère une erreur car `private`
}
}
$voiture2 = new VoitureEssence("Renault", "grise", "140 km/h");
$voiture2->afficherDetails();
Test de mémorisation/compréhension
TP pour réfléchir et résoudre des problèmes
Dans ce TP, vous allez créer une classe Fichier.
Les étapes pour réaliser ce TP sont les suivantes :
-
Dans votre répertoire "Documents" créez le répertoire
tp_visibilite. -
Dans ce répertoire, créez le fichier
autoload.php:<?phpspl_autoload_register(function($class) {require 'classes/' . $class . '.php';}); -
Dans ce répertoire, créez le fichier
main.php:<?phpinclude 'autoload.php';// Les 3 visibilitésprint("Les 3 visibilités \n\n"); -
Testez le fonctionnement de ce fichier :
php main.php -
Dans le répertoire
visibilitecréez le répertoireclasses -
Dans ce répertoire, créez le fichier
Fichier.phppour définir la classeFichier.Cette classe doit avoir 2 propriétés privées :
$nomet$chemin. -
Ensuite, définissez le constructeur de la classe.
Le constructeur doit prendre 2 paramètres :
$nomet$chemin. Ce constructeur doit :- appeler une méthode privée
setNompour assigner$nomà la propriété privée$nom. - appeler une méthode privée
setCheminpour assigner$cheminà la propriété privée$chemin.
- appeler une méthode privée
-
Définissez la méthode privée
setNom. Cette méthode doit prendre un paramètre$nomet l'assigner à la propriété privée$nom. -
Définissez la méthode privée
setChemin. Cette méthode doit prendre un paramètre$cheminet l'assigner à la propriété privée$chemin. -
Enfin, définissez une méthode publique
creerqui utilise :- la fonction
mkdirpour créer le dossier au chemin spécifié ($chemin) - et la fonction
touchpour créer le fichier ($nom) à l'intérieur.
- la fonction
-
Dans le fichier
main.php:- créez une instance de la classe
Fichieren passant le nom et le chemin du fichier au constructeur ("monFichier.txt", "monDossier"). - et appelez ensuite la méthode
creerpour créer le fichier. - Code du fichier
main.php:
include 'autoload.php';// Les 3 visibilitésprint("Les 3 visibilités \n\n");$fichier = new Fichier("monFichier.txt", "monDossier");$fichier->creer(); - créez une instance de la classe
Voici une présentation des fonctions PHP de gestion de fichiers et de répertoires que nous utilisons dans ce TP :
-
touch($filename): Cette fonction permet de créer facilement un fichier.https://www.php.net/manual/fr/function.touch.php Elle tente de définir l'heure d'accès et de modification du fichier nommé dans le paramètre
filename. Si le fichier n'existe pas, la fonctiontouch()tente de le créer. -
mkdir($pathname): Cette fonction tente de créer un répertoire nommépathname.https://www.php.net/manual/fr/function.mkdir.php La fonction renvoie TRUE en cas de succès, FALSE en cas d'échec.
Déclarer toutes les propriétés private par défaut, puis les exposer uniquement si nécessaire via des méthodes public. Passer de private à public est facile ; l'inverse casse le code extérieur. Une propriété publique modifiable de l'extérieur sans contrôle peut introduire des états incohérents difficiles à déboguer.
Une solution
Vous devez être connecté pour voir le contenu.