Depuis PHP 5.4 il est possible afin d'éviter les colisions de noms d'organiser son code PHP à l'aide d'espaces de noms.
Pour ce faire nous avons besoin de plusieurs éléments.
- Un répertoire qui contiendra les sources des fichiers php que nous souhaiterons utiliser.
- Un autoloader que nous placerons dans le fichier index du site ou le fichier main du programme.
- Les mots clés namespace sur les fichiers sources et use sur les fichiers qui utiliseront les bibliothéques.
Dans l'exemple suivant, nous allons créer une classe test qui sera accessible dans un fichier main. les différentes bibliothèques susceptibles d'être utilisées, le seront dans un répertoire intitulé src qu'ira parcourir l'autoloader.
1.Créer une bibiothèque source
Dans le répertoire principal contenant le programme php, on va créer un répertoire src contenant tous les répertoires contenant les bibliothéques ainsi on aura test, Views et controllers.
Dans controllers on aura notre fichier requeteController.php contenant la classe requeteController.
Pour des raisons de facilité de lecture, il est conseillé d'appeler la classe du même nom que le fichier, mais il est possible de l'appeler différemment. Lors de l'appel il faudra néanmoins spécifier la différence. Il est également possible de créer des modules contenant des objets autres que des classes, comme des tableaux, des interfaces, etc.
2.Code du fichier requeteController.php
<$php
namespace test\Controllers;
class requeteController{
private int $mapropriete;
private string $tapropriete;
function __construct(int $param1,string $param2){
$this->mapropriete=$param1;
$this->tapropriete=$param2;
}
public function getMaPropriete(){
return $this->mapropriete;
}
}
?>
On voit que l'espace de noms est matérialisé par la première ligne. l'appel dans le fichier principal se fera sur cet espace de noms.
3.Code du fichier main.php
<$php
use test\MyApp;
use test\Controllers\requeteController;
require('autoloader.php');
$instance1=new MyApp(1,2);
$requete=new requeteController(3,"chaine");
print_r("la somme est ".$instance1->somme());
print_r("requetecontroller=".$requete->getMaPropriete());
?>
L'appel à l'espace de nom s'effectue grâce au mot clé use. Toutefois l'appel ne peut aboutir si les fichiers de bibliothèques ne sont pas préalablement chargés par l'application. Contrairement à python ou la directive import charge le module et permet l'appel des classes. Dans PHP les deux traitements sont dissociés. C'est au fichier autoloader de charger les bibliothéques et de faire le lien entre l'espace de noms de la classe et l'arborescence de fichier. Quand l'autoloader trouve la correspondance, il effectue un require sur le fichier correspondant.
4.Code de autoloader.php
define('SRC_DIR','src\\');
$src_path=dirname(__FILE__).'\\'.SRC_DIR;
set_include_path($src_path);
function my_psr4_autoloader($class) {
// replace namespace separators with directory separators in the relative
// class name, append with .php
$file_path = dirname(__FILE__).'\\'.SRC_DIR . $class . '.php';
$file = str_replace('\\', '/', $file_path);
// if the file exists, require it
if (file_exists($file_path)) {
require $file_path;
}
}
spl_autoload_register('my_psr4_autoloader');
?>
Dans le code de l'autoloader, on remarque qu'il faut spécifier un répertoire de départ à partir duquel rechercher les bibliothèques. Faire une substitution de chaine pour permettre la correspondance entre les espaces de noms et l'arborescence des fichiers.
Si le fichier existe, alors il est chargé à l'aide d'un require.
C'est la fonction spl_autoload_reqister qui a ce rôle via une fonction passée en callback. Ici my_psr4_autoloader.