PHP 5.3 ajoute une notion intéressante : les espaces de nom (ou namespace en anglais). Les espaces de nom permettent de séparer différents … « espace« , permettant ainsi d’avoir deux classe portant le même nom. Idéal pour l’utilisation de framework mais aussi de « l’isolation » de certains composants. Voyons voir comment créer un chargeur automatique (ou autoloader) comprenant les espaces de nom.
Si vous êtes sous Ms Windows, aucun problème un simple spl_autoload_register(); suffit. Malheureusement, sous *nix un bug existe il faudra donc implémenté une solution maison.
Le code
Ce code provient du « PHP Standards Working Group » :
function autoload($className) { $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strripos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; } |
Pour l’utiliser, il faut définir deux choses :
- Ne pas oublier de modifier l’include path si nécessaire.
- Ajouter cette fonction au chargeur de classes présent.
L’exemple
Voici un exemple un peu plus complet.
index.php
<?php set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/lib/');//on ajoute le dossier lib dans l'include path spl_autoload_register();//sur windows ceci devrait suffire . //le code pour les autres //---------------------------------------------------------- function autoload($className) { $className = ltrim($className, '\\'); $fileName = ''; $namespace = ''; if ($lastNsPos = strripos($className, '\\')) { $namespace = substr($className, 0, $lastNsPos); $className = substr($className, $lastNsPos + 1); $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR; } $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; require $fileName; } spl_autoload_register('autoload'); //---------------------------------------------------------- //fin du code de fix use grummfy\test\Test; Test::sayHello(); \grummfy\std\Test::sayHello(); # EOF |
./lib/grummfy/test/Test.php
<?php namespace grummfy\test;//pour rappel ceci doit-être la première instruction php (et on ne doit pas avoir de HTML avant) echo 'Je suis inclus (' . __FILE__ . ')!'; class Test { public static function sayHello() { echo 'Bonjour depuis ' . __CLASS__; } } # EOF |
./lib/grummfy/std/Test.php
<?php namespace grummfy\std; echo 'Je suis inclus (' . __FILE__ . ')!'; class Test { public static function sayHello() { echo 'Bonjour depuis ' . __CLASS__; } } # EOF |
Le résultat devrait être :
Je suis inclus (/.../lib/grummfy/test/Test.php)!
Bonjour depuis grummfy\test\Test
Je suis inclus (/.../lib/grummfy/std/Test.php)!
Bonjour depuis grummfy\std\Test