Billet du blogue

Auto-load dans CodeIgniter et Kohana

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?

Posté le avec les tags: , et .

Commentaires fermés

Les commentaires pour ce billet ont été désactivés un mois après la date de publication de ce-dernier. Vous désirez exprimer votre opinion sur ce billet malgré le fait que les commentaires aient été désactivés ? Utilisez le formulaire de contact.


Fil atom des commentaires de ce billet3 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.

    function __autoload($class_name) {
      require_once 'includes/Class/'.$class_name . '.php';
    }
    

    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 :

    $user = new User();
    

    et PHP inclurait le fichier includes/Class/User.php et tenterait ensuite de créer un nouvel objet User.

    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 < autoload

    Tout 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

    • charger les classes principales (qui reviennent toujours) avec require
    • passer par autoload pour le reste.

    Nath (2 février 2008 à 2:46 EST)