PHP: Utiliser le Zend_Loader indépendamment du Zend Framework

by Joris on juin 29, 2010

php-logo

Je ne sais pas si vous avez déjà travaillé avec le Zend Framework récemment mais pour avoir suivi un peu l’évolution des modules de base du framework depuis la version 1.7.7, je peux vous dire que le loader du Zend Framework est vraiment une aubaine !

Le code source du loader (qui permet de convertir les underscores et anti-slashes en séparateur de dossier) a été voté en temps que standard en ce qui concerne l’autoloading des classes PHP 5.3.
Vous pourrez d’ailleurs en lire d’avantage sur le PHP Standards Working Group.

Mise en œuvre

Un petit exemple simple et efficace vous permettra de vous démontrer la simplicité du module.
Téléchargez le Zend Framework et ne conservez que les fichiers suivants :

Zend
|-- Exception.php
|-- Loader
|   |-- Autoloader
|   |   |-- Interface.php
|   |   `-- Resource.php
|   |-- Autoloader.php
|   |-- Exception.php
|   |-- PluginLoader
|   |   |-- Exception.php
|   |   `-- Interface.php
|   `-- PluginLoader.php
|-- Loader.php
`-- Version.php

Développez ensuite l’arborescence suivante en créant les fichiers indiqués.
Note : nous travaillons avec PHP 5.3.2 évidemment !

zloader
|-- Foo
|   |-- Bar.php
|   `-- FooBar.php
|-- Zend/
`-- public
    `-- index.php

Voici le code source des deux classes dans le dossier Foo :

1
2
3
4
5
6
7
8
9
<?php
// Foo/Bar.php
class Foo_Bar
{
    public static function hello()
    {
        var_dump(__METHOD__);
    }
}
1
2
3
4
5
6
7
8
9
10
<?php
// Foo/FooBar.php
namespace Foo;
class FooBar
{
    public static function hello()
    {
        var_dump(__METHOD__);
    }
}

Et maintenant, de manière extrêmement simple, nous allons créer une instance du Zend_Loader_AutoLoader et charger les classes aussi facilement qu’avec une utilisation complète du loader au sein d’une application Zend Framework.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
// public/index.php
// On définit l'include_path afin d'avoir la visibilité sur le module
set_include_path(implode(PATH_SEPARATOR, array(
    __DIR__ . DIRECTORY_SEPARATOR . '..',
    get_include_path()
)));
 
// On récupère le loader
require_once 'Zend/Loader/Autoloader.php';
 
// On enregistre le namespace Foo
Zend_Loader_Autoloader::getInstance()->registerNamespace('Foo');
 
// Tests
Foo_Bar::hello();
\Foo\FooBar::hello();

Résultat :

string 'Foo_Bar::hello' (length=14)
string 'Foo\FooBar::hello' (length=17)

Avec ces quelques lignes de code, il n’est plus question de vous embêter avec la fonction __autoload() ou autre artifice permettant l’inclusion de vos classes.

8 comments

C’est vraiment ce que j’apprécie sur ce framework. Le fait de pouvoir utiliser indépendamment les librairies est très utile. C’est vraiment ce qui manque à cakephp (même si cela reste possible, c’est toujours moins évident que sous zend ).

Et merci pour vos articles ~

by boulet_sensei on 01/07/2010 at 04:43. #

Il n’y a pas à dire, le Zend Framework, c’est efficace.
10 fichiers, 2000 lignes de code, pour pouvoir inclure des classes automatiquement en, je cite, « convertir les underscores et anti-slashes en séparateur de dossier »…
Cela me laisse rêveur.

by mageekguy on 01/07/2010 at 12:21. #

@mageekguy

Le nombre de lignes importe peu… C’est le nombre de lignes exécutées qui semble important :)
Tu peux dégager le PluginLoader et Resource.php si tu veux… et garder que http://goo.gl/QCEQ.

Mais l’intérêt est justement de conserver le loader en temps qu’entité à part entière et non plus comme une fonction cachée dans je ne sais quel fichier…

by Joris on 01/07/2010 at 12:34. #

J’ai une classe d’autoload qui fait 37 lignes, lignes vides comprises, qui suit la préconisation du working group et qui fonctionne parfaitement…

by mageekguy on 01/07/2010 at 12:48. #

Réglé, merci Greg !

by Joris on 05/07/2010 at 11:15. #

C’est une preuve que les articles plaisent :-)

by boulet_sensei on 06/07/2010 at 14:36. #

Leave your comment

Not published