Une des fonctionnalités qui cause une certaine confusion dans les frameworks PHP est la notion d’auto-loading. Cette notion peut prendre deux formes :
La fausse
Le chargement de certains fichiers lorsque l’application est chargée. Par exemple, dans CodeIgniter, on peut définir un array de librairies (entres autres) qu’on veut charger chaque fois qu’une page est demandée (réf).
$autoload['libraries'] = array('database', 'session', 'xmlrpc');
Cela nous évite d’avoir à coder ceci :
$this->load('database');
$this->load('session');
$this->load('xmlrpc');
dans chaque contrôleur ou modèle. Les librairies sont entièrement chargées dans le code à chaque fois, ce qui peut occasionner des problèmes de performance. On devrait plutôt parler de pre-loading dans ce cas.
La vraie
Le chargement de certains fichiers lorsqu’une classe inconnue de PHP est instanciée. Cette technique nécessite PHP5 car c’est à partir de cette version qu’a été introduite la fonction __autoload. Kohana, par exemple, tire profit de cette fonction en ne chargeant pas les classes lorsque l’application est chargée, mais bien lorsqu’elles sont instanciées (réf). Cela nous permet donc de ne charger en mémoire que les classes dont nous nous servons.
Il est à noter cependant, que si on veut utiliser le « vrai » auto-loading, les objets doivent être créés de manière native, comme ceci :
$session = new Session;
echo $session->id();
et non comme ceci :
$this->load->library('session');
echo $this->session->id()
On peut aussi noter que bien que je dises que Kohana implémente l’auto_loading natif de PHP, il offre aussi un array de ressources à pre-loader.
Conclusion
Des commentaires?
Je suis surpris que Codeigniter n’utilise pas l’autoload natif de PHP5 (surement pour avoir une compatibilité avec PHP4). C’est vraiment essentiel et en plus ça permet de ne pas avoir à inclure tous les fichiers un par un, ou dans ce cas ci, de les inscrire dans un fichier de config.
Un simple bout de code ce genre genre est hyper utile (je l’ai simplifié au maximum).
Une raison de plus d’utiliser Kohana lors de future projet.
Pierre-Luc Babin (1er février 2008 à 13:59 EST)
En effet, dans ton exemple, on pourrait tenter d’instancier une objet inconnu de PHP :
et PHP inclurait le fichier
includes/Class/User.phpet tenterait ensuite de créer un nouvel objetUser.Et tu as aussi raison en supposant que CodeIgniter ne supporte pas le vrai auto-loading pour supporter PHP4. C’est notamment une des raisons qui a poussé certains développeurs à mettre sur pied Kohana — pour pouvoir profiter des fonctionnalités avancées de PHP5 en matière d’OOP.
Rémi Prévost (1er février 2008 à 14:06 EST)
Au forum PHP, lors d’une conférence sur l’optimisation des performances par un développeur de chez wat.tv, il nous expliquait que d’après ses tests sur les temps d’exécution :
require < require_once < autoloadTout passer par l’autoload serait donc très gourmand, mais mettre require_once à chaque fois l’est aussi. Et bien sûr on ne peut pas tout charger avec require pour éviter de charger plusieurs fois.
Son conseil était donc de
Nath (2 février 2008 à 2:46 EST)