Aller au contenu principal

Les espaces de noms

Notions théoriques

Les espaces de noms (namespaces en anglais) en PHP servent à séparer des éléments de code (des classes, des fonctions, des constantes, etc) pour éviter les conflits de noms entre différents éléments de code (des classes, des constantes...) qui porteraient le même nom.

Exemple

Prenons l'exemple d'un projet avec 2 développeurs : Eva et Léo.

Immaginons que, dans un même projet:

  • Eva a créé une classe Categorie
  • et Léo a aussi créé une classe Categorie.

Grâce aux espaces de noms, il sera possible d'utiliser ces 2 classes différentes, qui portent le même nom.

Le mot-clé namespace

En PHP, les espaces de noms sont déclarés avec le mot-clé namespace.

Une fois un espace de noms déclaré, tous les éléments de code définis en dessous appartiennent à cet espace de noms.

Pour accéder à un élément de code dans un espace de noms, vous devez préfixer le nom de l'élément de code, par le nom de l'espace de noms.

namespace MonProjet\Utilitaires;

$monComposant1 = new MonProjet\Composants\MonComposant1;
$monComposant2 = new MonProjet\Composants\MonComposant2;

Le mot-clé use

Pour alléger le code, on utilise use qui permet :

  • d'importer une classe
  • sans préciser à chaque fois son espace de noms.
namespace MonProjet\Utilitaires;

use MonProjet\Composants\MonComposant1;
use MonProjet\Composants\MonComposant2;

$monComposant1 = new MonComposant1();
$monComposant2 = new MonComposant2();

Dans cet exemple, au lieu d'utiliser \MonProjet\Composants\MonComposant1 chaque fois que vous voulez instancier un objet de cette classe, vous pouvez simplement utiliser MonComposant1 après l'avoir importé avec use.

Exemple pratique

Supposons que vous ayez une classe Fichier dans un espace de noms GestionFichiers.

Vous pouvez déclarer l'espace de noms et la classe comme suit :

namespace GestionFichiers;

class Fichier {
// ...
}

Et pour utiliser la classe Fichier, vous devez préfixer le nom de la classe par le nom de l'espace de noms :

$fichier = new GestionFichiers\Fichier();
astuce

Si vous utilisez souvent cette classe dans votre code, préfixer le nom de la classe par le nom de l'espace de noms à chaque fois peut être fastidieux.

Pour simplifier cela, vous pouvez utiliser le mot-clé use pour importer la classe :

use GestionFichiers\Fichier;

$fichier = new Fichier();

Maintenant, vous n'avez plus besoin de préfixer le nom de la classe par le nom de l'espace de noms, car vous avez importé la classe avec le mot-clé use.

Test de mémorisation/compréhension


À quoi servent les espaces de noms en PHP ?


Comment définissez-vous un espace de noms en PHP ?


Comment pouvez-vous accéder à une classe ou une fonction d'un autre espace de noms en PHP ?



TP pour réfléchir et résoudre des problèmes

Nous allons maintenant coder un petit projet pour mettre en application les premières notions sur la POO.

Dans ce TP, vous allez créer 2 classes, Fichier et Dossier, chacune dans son propre espace de noms, et vous allez les utiliser pour gérer des fichiers et des dossiers sur un serveur.

Vous allez écrire du code PHP qui utilise :

  • les espaces de noms pour organiser les classes,
  • l'autoloading pour charger automatiquement les classes,
  • et des dossiers pour organiser les fichiers de classes.

Les étapes pour réaliser ce TP sont les suivantes :

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

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

    <?php
    include 'autoload.php';

    // Utiliser les namespaces
    print("Utiliser les namespaces \n\n");
  3. Testez le fonctionnement de ce fichier :

    php main.php


  4. Créez un dossier classes et à l'intérieur, 2 sous-dossiers :

    • GestionFichiers
    • et GestionDossiers.
  5. Dans le dossier GestionFichiers, créez un fichier Fichier.php qui définit une classe Fichier dans l'espace de noms GestionFichiers.

    Cette classe doit avoir une propriété publique nom. Nous allons plus tard lui ajouter des méthodes pour créer, lire, écrire et supprimer un fichier.

  6. Dans le dossier GestionDossiers, créez un fichier Dossier.php qui définit une classe Dossier dans l'espace de noms GestionDossiers.

    Cette classe doit avoir une propriété publique nom. Nous allons plus tard lui ajouter des méthodes pour créer, lister le contenu, et supprimer un dossier.

  7. Créez un fichier autoload.php qui définit une fonction spl_autoload_register pour charger automatiquement les classes.

    Cette fonction doit prendre en compte le dossier classes et les sous-dossiers.

  8. Dans votre fichier main.php,

    • incluez le fichier autoload.php,
    • utilisez le mot-clé use pour importer les classes Fichier et Dossier,
    • utilisez les classes Fichier et Dossier pour manipuler les dossiers et les fichiers grâce au langage PHP :
      • créer le dossier $dossier avec le nom monDossier
      • créer le fichier $fichier avec le nom monDossier/monFichier.txt,
      • écrire le texte 'Bonjour les SIO !' dans le fichier monFichier.txt,
      • lire le contenu du fichier monFichier.txt,
      • lister le contenu du dossier monDossier,
      • et finalement supprimer le fichier monFichier.txt et le dossier monDossier.
info

Voici une présentation des fonctions PHP de gestion de fichiers et de répertoires que nous utilisons dans ce TP (https://www.php.net/manual/fr/ref.filesystem.php) :

  • touch($filename) : Cette fonction permet de créer facilement un fichier.

    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.

  • file_get_contents($filename) : Cette fonction est utilisée pour lire le contenu d'un fichier dans une chaîne.

    Elle renvoie le contenu du fichier en cas de succès, FALSE en cas d'échec.

  • file_put_contents($filename, $data) : Cette fonction est un raccourci pour ouvrir un fichier, écrire des données (data) puis le fermer.

    Si filename n'existe pas, le fichier est créé. Sinon, le fichier existant est écrasé, sauf si l'option FILE_APPEND est définie.

  • unlink($filename) : Cette fonction supprime le fichier filename.

    Elle renvoie TRUE en cas de succès, FALSE en cas d'échec.

  • mkdir($pathname) : Cette fonction tente de créer un répertoire nommé pathname.

    La fonction renvoie TRUE en cas de succès, FALSE en cas d'échec.

  • scandir($directory) : Cette fonction renvoie un tableau de fichiers et de répertoires dans le directory.

    Par défaut, les entrées . et .. sont incluses.

  • rmdir($dirname) : Cette fonction supprime un répertoire dirname s'il est vide.

    Elle renvoie TRUE en cas de succès, FALSE en cas d'échec.

La classe Fichier aura ces 4 méthodes :

  • creer()

  • lire()

  • ecrire($contenu)

  • supprimer()

La classe Dossier aura ces 4 méthodes :

  • creer()
  • lister()
  • supprimer()

Voici le code du fichier main.php :

include 'autoload.php';

// Utiliser les namespaces
print("Utiliser les namespaces \n\n");

use GestionFichiers\Fichier;
use GestionDossiers\Dossier;

$dossier = new Dossier(); // Pour créer une instance de Dossier
$dossier->nom = 'monDossier';
$dossier->creer(); // Pour créer un répertoire dans votre disque dur

$fichier = new Fichier(); // Pour créer une instance de Fichier
$fichier->nom = 'monDossier/monFichier.txt';
$fichier->creer(); // Pour créer un fichier dans votre disque dur
$fichier->ecrire('Bonjour les SIO !');

print($fichier->lire()); // Affiche : Bonjour les SIO !
print("\n");
print_r($dossier->lister()); // Affiche : Array ( [0] => . [1] => .. [2] => monFichier.txt )

$fichier->supprimer();
$dossier->supprimer();
Une solution