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.
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 utiliserMonComposant1
après l'avoir importé avecuse
.
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();
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
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
etDossier
, 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 :
-
Dans votre répertoire "Documents" créez le répertoire
tp_namespaces
. -
Dans ce répertoire, créez le fichier
main.php
:<?php
include 'autoload.php';
// Utiliser les namespaces
print("Utiliser les namespaces \n\n"); -
Testez le fonctionnement de ce fichier :
php main.php
-
Créez un dossier
classes
et à l'intérieur, 2 sous-dossiers :GestionFichiers
- et
GestionDossiers
.
-
Dans le dossier
GestionFichiers
, créez un fichierFichier.php
qui définit une classeFichier
dans l'espace de nomsGestionFichiers
.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. -
Dans le dossier
GestionDossiers
, créez un fichierDossier.php
qui définit une classeDossier
dans l'espace de nomsGestionDossiers
.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. -
Créez un fichier
autoload.php
qui définit une fonctionspl_autoload_register
pour charger automatiquement les classes.Cette fonction doit prendre en compte le dossier
classes
et les sous-dossiers. -
Dans votre fichier
main.php
,- incluez le fichier
autoload.php
, - utilisez le mot-clé
use
pour importer les classesFichier
etDossier
, - utilisez les classes
Fichier
etDossier
pour manipuler les dossiers et les fichiers grâce au langage PHP :- créer le dossier
$dossier
avec le nommonDossier
- créer le fichier
$fichier
avec le nommonDossier/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 dossiermonDossier
.
- créer le dossier
- incluez le fichier
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 fonctiontouch()
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'optionFILE_APPEND
est définie. -
unlink($filename)
: Cette fonction supprime le fichierfilename
.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 ledirectory
.Par défaut, les entrées
.
et..
sont incluses. -
rmdir($dirname)
: Cette fonction supprime un répertoiredirname
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
Vous devez être connecté pour voir le contenu.