Aller au contenu principal

Les 3 visibilités

Schéma

Petite vérification​

Avant de commencer, vérifiez si vous savez...

  1. citer le nom de la méthode magique appelée automatiquement lorsqu'on essaie de convertir un objet en chaîne de caractères
  2. prédire ce qu'affiche ce code PHP, sans l'exécuter :
    class Voiture {
    public $marque;
    public function __construct($marque) {
    $this->marque = $marque;
    }
    public function __toString() {
    return "Voiture de marque " . $this->marque;
    }
    }
    $voiture = new Voiture("Peugeot");
    print($voiture);
  3. citer le nom de la méthode magique appelée lorsqu'on tente d'appeler une méthode non accessible ou inexistante sur un objet
📌 Réponse attendue

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.


Bonne pratique - Visibilité

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