Autochargement des classes et espaces de nom
Je ne sais pas si vous vous êtes penchés sur le problème, à savoir gérer les namespaces dans php 5.3 en ce qui concerne l'usage d'autoload.
Pour un projet perso, j'en suis arrivé à cette solution:
Comme à la PEAR, Zend etc, le nom complet des classes reflète la structure des répertoires dans lesquels elles sont situées.
Donc disons que j'ai une classe complètement qualifiée comme ceci:
\framework\sub\ns\Controller
Le fichier de la classe sera dans:
framework/sub/ns/Controller.php
Ce qu'il y a "avant" le répertoir framework/ n'importe pas (voir plus bas)
Comme dans mon projet il y a plusieurs namespaces indépendants (qui n'ont pas la même racine), j'utilise spl_autoload_register().
Voici à quoi je suis arrivé pour l'autoloading des classes du framework.
L'include path est vide car je ne travaille qu'avec des path absolus (plus rapide).
L'autoloading pour la partie userland est en fait exactement la même:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| // fichier de la classe \framework\Autoloader
namespace framework;
class Autoloader
{
private static $NS_LEN = 0; // pourrait être codé en dur, mais bon...
public static function register()
{
// store le strlen du namespace courant (framework\)
self::$NS_LEN = strlen(__NAMESPACE__) + 1;
// register l'autoload
spl_autoload_register(array(__CLASS__, 'autoload'));
}
public static function autoload($class)
{
// check si la classe est bien une classe controllée par le framework
// donc que "framework\" est bien le prefix
if (strpos($class, __NAMESPACE__.'\\') === 0) {
// ok, on envoie
// on virre le prefix "framework\" et on mappe le reste sur la structure du directory
include __DIR__.DIRECTORY_SEPARATOR
.str_replace('\\', DIRECTORY_SEPARATOR, substr($class, self::$NS_LEN))
.'.php';
}
}
} |
Code:
1 2 3 4 5 6 7 8 9 10
| // userland:
namespace userland;
use framework;
include '/path/to/framework/Autoloader.php';
framework\Autoloader::register();
$c = new framework\sub\ns\Controller;
$blah = new custom\ns\Blah; // \userland\custom\ns\Blah |
Avez-vous pensez à une autre solution ? A l'usage, cette technique m'est pleinement satisfaisante.