Loader PHP: chargez vos class automatiquement

oct 18 2009

Si par erreur (ou justement pas) vous vous mettez un jour à coder proprement en PHP, vous vous rendrez vite compte qu’avoir ces petites classes toute faite pour interroger une base de donnée ou parcer un fichier XML peut s’avérer très pratique. Une fois ces classes écrites une bonne fois pour toute, avec la gestion d’erreur qui va bien et tout et tout, il ne reste plus qu’a copier/coller celle dont on a besoin dans un dossier « Class » du projet en cours et on les appellera au besoin sur les pages concernées.

Mais voilà, trêve de plaisanteries, trois tonnes d’include en haut d’un fichier PHP ça va vite devenir très cochon et pas franchement lisible.

Nous allons voir ici comment utiliser la fonction __autoload() de PHP pour inclure automatiquement les fichiers contenant les classes que nous allons appeler.

Commençons par organiser un peux notre projet.

Créez un dossier à la racine du site qui va contenir toute les librairies de notre projet et créez dans celui ci un dossier « class » qui lui contiendra les classes de notre application.

Capture d’écran 2009-10-18 à 14.38.55

Créez maintenant un fichier nommé « Loader.php » à la racine du dossier « library » dans lequel nous allons placer le code suivant:

<?php

function __autoload($class_name) {

require_once ‘library/class/’ . $class_name . ‘.php’;

}

?>

On peut maintenant appeler ce fichier dans notre script d’origine, par exemple ici notre index.php

<?php

require_once(‘library/Loader.php’);

Ainsi une instanciassions de classe du type:

$sql_access = new db_access();

va automatiquement inclure le fichier « library/class/db_access.php » contenant la classe « db_access » et nous nous retrouvons directement avec une organisation du projet sous cette forme:

Capture d’écran 2009-10-18 à 23.00.58

Bienvenu dans le monde des projets bien organisés!

4 responses so far

  • Oncle Tom dit :

    `__autoload` est un palliatif pour PHP4 à éviter, une fois défini c’est foutu. Donc pas possible d’utiliser plusieurs autoloaders.

    En PHP5 y’a SPL avec `spl_autoload_register`.
    C’est beaucoup plus pratique, flexible et recommandé ;)

  • Thibaut dit :

    Je ne connaissais pas :) je regarderai ;) Merci pour l’info Oncle Tom!

  • kirek dit :

    Pourquoi pas avoir un fichier exemple nomé ‘webzone.php’ inclus en haut de toutes nos pages.

    Ce fichier contiendra lui même tous les includes nécessaires (include des classes, des fichiers fonctions etc etc).

    Puis à partir de n’importe quel fichier incluant ce ‘webzone.php’ on peux instantialiser nos objects (puisque leurs fichiers de classes sont inclus) avec genre: $table_client = new Table_clients()… etc

    Bref sur des gros projets on peux se retrouver avec des dizaines de fichiers classes/fonctions…

    Pis pour aller plus loin a vrai dire le fichier ‘webzone.php’ peut inclure lui même un autre fichier incluant d’autres classes. Dans mon cas ce fichier inclus un fichier nommé (db.php) dont ce dernier inclus toute les classes et fonctions utilisées pour acceder à la database (une table = une classe + 2 ou 3 fichiers de fonctions dont héritent toute les autres classes).

    Un autre point fait penser à avoir une variable tout en haut (exemple: $path_pages) qui prendra le chemin relatif à partir du fichier ou on réalise les include.

  • Thibaut dit :

    D’un point de vu purement fonctionnel ça marche, seulement la solution que tu propose est loin d’être propre.
    Tu va à chaque chargement de page inclure des fichiers que tu n’utilisera pas forcement et instancier des classes que tu n’utilisera pas.
    Par exemple si tu n’utilise pas ton $table_client ton instance sera quand même créée et prendra de l’espace mémoire coté serveur, de l’utilisation coté base de donnée… etc…

    La solution que tu propose n’a rien a voir avec ce dont je parle dans mon article et je pense qu’elle aura vite ces limites.

Laisser un commentaire