lundi 28 septembre 2009
Si vous développez vos projets PHP avec Zend Framework, il vient un temps où vos fichiers ou votre bootstrap commence à ressembler à ceci :
require_once('Zend/Auth.php');Sinon, les instructions require_once() sont éparpillées dans les pages et les classes selon le besoin, ce qui, à mon avis, n'est pas tout le temps une bonne pratique. À chaque appel de la page, PHP doit inclure toutes les librairies nécessaires à l'exécution du code. Dès qu'on utilise un nouveau composant dans le projet, on doit retourner au fichier bootstrap pour ajouter la librairie à la liste de chargement.
require_once('Zend/Cache.php');
require_once('Zend/Config.php');
require_once('Zend/Date.php');
require_once('Zend/Db.php');
require_once('Zend/Dom/Query.php');
require_once('Zend/Locale.php');
require_once('Zend/Measure/Binary.php');
...
Comme une page n'utilise pas tous les objets, pourquoi ne pas laisser autoload décider quelles librairies charger, au moment de l'instanciation ? Ceci peut se faire par la fonction __autoload de PHP ou encore par la classe Autoloader du Zend Framework. Étant donné que les noms sont uniformisés (remarquez que Zend_Dom_Query est placé dans Zend/Dom/Query.php), on peut tirer avantage de cette classe pour simplifier la structure du projet. Le mécanisme d'autoload est légèrement moins performant mais dans la balance, on y gagne probablement si le script PHP n'a pas besoin de toutes les classes.
Ce qui veut dire que toute la série de require_once() ci-dessus peut être remplacée par deux lignes de code :
require_once('Zend/Loader/Autoloader.php');Avec ça, dès qu'un objet du Zend Framework est créé, ZendLoader charge le fichier sur demande. Fini les longues listes de fichiers inclus.
$autoloader = Zend_Loader_Autoloader::getInstance();
Notez qu'on peut aussi combiner les deux approches :
- inclure systématiquement toutes les librairies critiques à l'application web
- laisser Zend_Loader charger les librairies secondaires ou celles qu'on aurait pu avoir tendance à oublier