Aller au contenu principal

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


Quelle est la visibilité la moins restrictive en PHP ?


Quelle est la visibilité la plus restrictive en PHP ?


Quelle visibilité permet d'accéder à une propriété ou une méthode uniquement depuis la classe elle-même ?


Quelle visibilité permet d'accéder à une propriété ou une méthode depuis la classe elle-même et ses héritières ?


Quelle visibilité permet d'accéder à une propriété ou une méthode de n'importe où ?



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 :

  1. Dans votre répertoire "Documents" créez le répertoire tp_visibilite.

  2. Dans ce répertoire, créez le fichier autoload.php :

    <?php
    spl_autoload_register(function($class) {
    require 'classes/' . $class . '.php';
    });
  3. Dans ce répertoire, créez le fichier main.php :

    <?php
    include 'autoload.php';

    // Les 3 visibilités
    print("Les 3 visibilités \n\n");
  4. Testez le fonctionnement de ce fichier :

    php main.php

  5. Dans le répertoire visibilite créez le répertoire classes

  6. Dans ce répertoire, créez le fichier Fichier.phppour définir la classe Fichier.

    Cette classe doit avoir 2 propriétés privées : $nom et $chemin.

  7. Ensuite, définissez le constructeur de la classe.

    Le constructeur doit prendre 2 paramètres : $nom et $chemin. Ce constructeur doit :

    • appeler une méthode privée setNom pour assigner $nom à la propriété privée $nom.
    • appeler une méthode privée setChemin pour assigner $chemin à la propriété privée $chemin.
  8. Définissez la méthode privée setNom. Cette méthode doit prendre un paramètre $nom et l'assigner à la propriété privée $nom.

  9. Définissez la méthode privée setChemin. Cette méthode doit prendre un paramètre $chemin et l'assigner à la propriété privée $chemin.

  10. Enfin, définissez une méthode publique creer qui utilise :

    • la fonction mkdir pour créer le dossier au chemin spécifié ($chemin)
    • et la fonction touch pour créer le fichier ($nom) à l'intérieur.
  11. Dans le fichier main.php :

    • créez une instance de la classe Fichier en passant le nom et le chemin du fichier au constructeur ("monFichier.txt", "monDossier").
    • et appelez ensuite la méthode creer pour créer le fichier.
    • Code du fichier main.php :
    include 'autoload.php';

    // Les 3 visibilités
    print("Les 3 visibilités \n\n");

    $fichier = new Fichier("monFichier.txt", "monDossier");
    $fichier->creer();
info

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 fonction touch() 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.

Une solution